Pourquoi une référence constante Enum ne peut-elle pas être qualifiée dans une étiquette de cas?

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 chaque case , et que deux valeurs constantes de ce type ne peuvent pas être identiques. Le compilateur vérifie les valeurs constantes en double dans une instruction switch au moment de la compilation; le format de fichier de class 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.