web-dev-qa-db-fra.com

Pourquoi utiliser Enums au lieu de Constants? Quel est le meilleur en termes de conception logicielle et de lisibilité

J'ai un scénario dans lequel j'ai des types de joueurs ARCHER, WARRIOR et sorcerer. Que dois-je utiliser en classe de joueur? Une variable chaîne pour le type ou un enum? Pourquoi énumérer et pourquoi Constant Strings. S'il vous plaît aider avec des raisons.

55
Waqas

Supposons que vous utilisiez des chaînes constantes (ou des valeurs int - il en va de même pour elles):

// Constants for player types
public static final String ARCHER = "Archer";
public static final String WARRIOR = "Warrior";

// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";

alors vous finissez par ne pas savoir vraiment le type de vos données, ce qui peut conduire à un code potentiellement incorrect:

String playerType = Constants.MALE;

Si vous utilisez des enums, cela aboutirait à:

// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;

De même, les énumérations donnent un ensemble restreint de valeurs:

String playerType = "Fred"; // Hang on, that's not one we know about...

contre

PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!

De plus, les enums en Java peuvent avoir plus d'informations associées et peuvent également avoir un comportement. Beaucoup mieux à tous égards.

109
Jon Skeet

Les énumérations vous limitent au jeu d'entrées requis alors que même si vous utilisez des chaînes constantes, vous pouvez toujours utiliser d'autres chaînes ne faisant pas partie de votre logique.

Cela vous aide à ne pas vous tromper, à entrer quelque chose en dehors du domaine tout en saisissant des données et améliore également la lisibilité du programme.

De plus, vous pouvez toujours utiliser vos enums en tant que chaîne si vous le souhaitez. Voici une référence .

12
Nitin Chhajer

En plus de ne pas vous laisser donner une valeur incorrecte, il existe une autre caractéristique des énumérations qui peut sembler mineure, mais qui, à mon avis, est très importante. Les IDE modernes peuvent suggérer automatiquement des valeurs pour les énumérations, alors qu’il n’existe aucun moyen de déduire de manière fiable les valeurs possibles d’une constante de chaîne (Intellij IDEA effectue cette dernière, mais uniquement pour les classes JDK et les bibliothèques populaires). Ceci est particulièrement utile lorsque vous explorez une nouvelle API. 

5
NewlessClubie

Je vous conseillerais d'utiliser des énumérations uniquement si vous avez réellement besoin de constantes énumérées ou de fonctionnalités supplémentaires communes pour tous les éléments.

Cela dépend bien sûr du type d'application que vous écrivez et des versions et périphériques que vous souhaitez prendre en charge.

La raison en est que les énumérations ajoutent une surcharge car elles allouent des instances de leurs éléments. Vous pouvez remarquer qu’il ya un minimum d’énums sur la plate-forme Android et que presque toutes les constantes sont des ints statiques finales (comme View.GONE, etc.).

0
Alex Orlov

Enum est préférable d'utiliser pour la sécurité de type. Des valeurs incorrectes ne peuvent pas être entrées. Mais enum dans Android prend beaucoup de mémoire, vous devriez plutôt utiliser intdef. Reportez-vous à cette réponse pour un exemple et une explication: -

IntDef/StringDef Exemple

Vous pouvez également vérifier le code source Android qui remplace les enums par IntDef/StringDef dans la mesure du possible. Ex. Voir.VISIBLE. 

0
Harish Gyanani