41 votes

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

Pourquoi la compilation du code suivant échoue-t-elle lors de la modification de l'instruction case

 case ENUM1: doSomeStuff();
 

travaux?

 public enum EnumType
{
    ENUM1, ENUM2, ENUM3;

    void doSomeStuff()
    {
        switch(this)
        {
        case EnumType.ENUM1: doSomeStuff();
        }
    }
}
 

33voto

BalusC Points 498232

C'est pour éviter la possibilité de comparer les différents types d'énumérations. Il est logique de le restreindre à un type, c'est à dire le type de la valeur d'enum en switch déclaration.

Mise à jour: c'est fait pour garder la compatibilité binaire. Voici un cite d'environ à mi-chemin chapitre 13.4.9 de JLS:

L'une des raisons pour exiger, d'inlining des constantes c'est qu' switch états exigent des constantes sur chaque case, et pas de deux de ces valeurs de constantes peuvent être les mêmes. Le compilateur vérifie pour dupliquer les valeurs des constantes dans un switch déclaration au moment de la compilation; l' class format de fichier ne fait pas le lien symbolique de valeurs.

En d'autres termes, en raison de l'identificateur de classe (en EnumType.ENUM1, il ne peut pas être représenté comme une compile-time expression constante, alors qu'il est requis par l' switch déclaration.

29voto

Jörn Horstmann Points 18118

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();
}
 

20voto

ColinD Points 48573

Étant donné que vous basculez sur un objet de type EnumType et que ses seules valeurs possibles 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’y avoir de toute façon case OtherEnumType.ENUM1: .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X