Les deux sites ints
y enums
peut utiliser à la fois switch ou if-then-else, et l'utilisation de la mémoire est également minimale pour les deux, et la vitesse est similaire - il n'y a pas de différence significative entre eux sur les points que vous avez soulevés.
Cependant, la différence la plus importante est la vérification des types. Enums
sont vérifiés, ints
ne le sont pas.
Considérez ce code :
public class SomeClass {
public static int RED = 1;
public static int BLUE = 2;
public static int YELLOW = 3;
public static int GREEN = 3; // sic
private int color;
public void setColor(int color) {
this.color = color;
}
}
Alors que de nombreux clients l'utiliseront correctement,
new SomeClass().setColor(SomeClass.RED);
Rien ne les empêche d'écrire cela :
new SomeClass().setColor(999);
Il y a trois problèmes principaux avec l'utilisation du public static final
modèle :
- Le problème se produit à temps de fonctionnement pas compiler temps, donc ça va être plus cher à réparer, et plus difficile de trouver la cause.
- Vous devez écrire du code pour gérer les mauvaises entrées - typiquement un
if-then-else
avec une finale else throw new IllegalArgumentException("Unknown color " + color);
- encore cher
- Rien n'empêche une collision des constantes - le code de la classe ci-dessus compilera même si
YELLOW
y GREEN
les deux ont la même valeur 3
Si vous utilisez enums
vous abordez tous ces problèmes :
- Votre code ne sera pas compilé si vous ne passez pas des valeurs valides dans les champs
- Pas besoin d'un code spécial "mauvaise entrée" - le compilateur s'en charge pour vous.
- Les valeurs des Enum sont uniques