Pourquoi le code suivant ne parvient-il pas à comstackr, tout en changeant la déclaration de cas en
case ENUM1: doSomeStuff();
travaux?
public enum EnumType { ENUM1, ENUM2, ENUM3; void doSomeStuff() { switch(this) { case EnumType.ENUM1: doSomeStuff(); } } }
Cela permet d’éviter la possibilité de comparer différents types de énumérations. Il est logique de le limiter à un type, c’est-à-dire au type de la valeur enum dans l’instruction switch
.
Mise à jour : il s’agit en fait de conserver la compatibilité binary. Voici un extrait du chapitre 13.4.9 de JLS:
Une des raisons pour lesquelles il est nécessaire d’inclure des constantes est que les instructions de
switch
nécessitent des constantes pour chaquecase
, et que deux valeurs constantes de ce type ne peuvent pas être identiques. Le compilateur vérifie les valeurs constantes en double dans une instructionswitch
au moment de la compilation; le format de fichier declass
ne fait pas le lien symbolique des valeurs de cas.
En d’autres termes, en raison de l’identificateur de classe dans EnumType.ENUM1
, il ne peut pas être représenté sous la forme d’une expression constante comstacktime, bien qu’il soit requirejs par l’instruction switch
.
Cela ne répond pas vraiment à votre question, mais si vous avez du code dépendant de la valeur enum, vous pouvez également créer une méthode abstraite dans votre enum qui est surchargée pour chaque valeur:
public enum EnumType { ENUM1 { @Override public void doSomeStuff() { // do something } }, ENUM2 { @Override public void doSomeStuff() { // do something else } }; public abstract void doSomeStuff(); }
Comme vous EnumType
sur un object de type EnumType
et que les seules valeurs possibles pour lui sont les constantes enum, il n’est pas nécessaire de qualifier à nouveau ces constantes dans le commutateur. Après tout, il serait illégal d’avoir le case OtherEnumType.ENUM1:
de toute façon.