J'ai un scénario dans lequel j'ai Types de joueurs ARCHER
, WARRIOR
et sorcerer
.
Que dois-je utiliser dans la classe Player pour un type de joueur ?
Constant Final static String ou une variable Enum ? et pourquoi ?
Veuillez m'aider à expliquer pourquoi.
Réponses
Trop de publicités?Supposons que vous utilisiez des chaînes constantes (ou int
il en va de même pour eux) :
// 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";
vous finissez par ne pas vraiment connaître le type de vos données, ce qui conduit à un code potentiellement incorrect :
String playerType = Constants.MALE;
Si vous utilisez des enums, cela se traduirait par :
// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;
De même, les enums donnent un ensemble restreint de valeurs :
String playerType = "Fred"; // Hang on, that's not one we know about...
vs
PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!
En outre, les enums en Java peuvent être associés à davantage d'informations et peuvent également avoir un comportement. C'est beaucoup mieux.
Les Enums vous limitent à l'ensemble des entrées requises alors que même si vous utilisez des chaînes constantes, vous pouvez toujours utiliser d'autres chaînes qui ne font pas partie de votre logique.
Cela vous aide à ne pas faire d'erreur, à ne pas saisir quelque chose hors du domaine, lors de la saisie des données et améliore également la lisibilité du programme.
De plus, vous pouvez toujours utiliser vos enums comme String si vous le souhaitez. Voici un exemple de référence .
En plus de ne pas vous permettre de fournir une valeur incorrecte, il y a encore une autre caractéristique des enums qui peut sembler mineure, mais qui à mon avis est très importante. Les IDE modernes peuvent automatiquement suggérer des valeurs pour les enums, alors qu'il n'y a aucun moyen de déduire de manière fiable les valeurs possibles d'une constante de type chaîne (Intellij IDEA le fait, mais seulement pour les classes JDK et les bibliothèques populaires). Cela est particulièrement utile lorsque vous explorez une nouvelle API.
Il est préférable d'utiliser les Enum pour la sécurité des types. Il est impossible de saisir des valeurs erronées. Mais les enum prennent beaucoup de mémoire dans Android, vous devriez utiliser intdef à la place. Référez-vous à cette réponse pour l'exemple et l'explication:-
Vous pouvez également vérifier le code source d'Android : il remplace les enums par des IntDef/StringDef chaque fois que cela est possible. Ex. View.VISIBLE.
Je vous conseille d'utiliser les enums uniquement si vous avez vraiment besoin de constantes énumérées, ou d'une fonctionnalité supplémentaire commune à tous les éléments.
Cela dépend bien sûr du type d'application que vous écrivez et des versions et appareils que vous souhaitez prendre en charge.
La raison en est que les enums ajoutent des frais généraux car ils allouent des instances de leurs éléments. Vous pouvez remarquer qu'il y a un minimum d'enums dans la plateforme Android, et que presque toutes les constantes sont des ints statiques finaux (comme View.GONE et des choses comme ça).