Tout d'abord, je dirai que je suis beaucoup plus familier avec les énumérations en C # et il semble que les énumérations en java soient un vrai gâchis.
Comme vous pouvez le voir, j'essaie d'utiliser une instruction switch @ enums dans mon exemple suivant, mais j'obtiens toujours une erreur, quoi que je fasse.
L'erreur que je reçois est:
L'étiquette de boîtier qualifiée
SomeClass.AnotherClass.MyEnum.VALUE_A
doit être remplacée par la constante d'énumération non qualifiéeVALUE_A
Le fait est que je comprends bien l'erreur, mais je ne peux pas simplement écrire VALUE_A car l'énumération est située dans une autre sous-classe. Existe-t-il un moyen de résoudre ce problème? Et pourquoi cela se passe-t-il en Java?
//Main Class
public class SomeClass {
//Sub-Class
public static class AnotherClass {
public enum MyEnum {
VALUE_A, VALUE_B
}
public MyEnum myEnum;
}
public void someMethod() {
MyEnum enumExample //...
switch (enumExample) {
case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
//..
break;
}
}
}
}
java
enums
switch-statement
Popokoko
la source
la source
Enum
est extrêmement pratique une fois que vous les maîtrisez - pas du tout un gâchis. Ils sont beaucoup plus flexibles et pratiques que les énumérations simples (simplement une valeur entière étiquetée) comme on le voit sur d'autres plates-formes. Voir le didacticiel Oracle . Découvrez les optimisationsSet
/Map
implémentations:EnumSet
&EnumMap
.Réponses:
Changez-le en ceci:
L'indice est dans l'erreur. Vous n'avez pas besoin de qualifier les
case
étiquettes avec le type enum, juste sa valeur.la source
Java déduit automatiquement le type des éléments
case
, de sorte que les étiquettes doivent être non qualifiées.la source
MyEnum
ce qui n'aurait pas de sens.static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}
au lieu decase 7
. Cette restriction pour les énumérations n'a donc aucun sens (je peux utiliser non seulement des littéraux primaires, mais aussi des constantes définies manuellement pour l'switch
expression entière , mais je ne peux pas utiliser des constantes définies manuellement, mais uniquement des noms primaires pour les énumérations).cela devrait faire:
la source
Faux:
Droite:
la source
Voilà comment je l'utilise. Et cela fonctionne à merveille -
Et
switch-case
comme indiqué ci-dessousla source
Écrivez
someMethod()
de cette façon:Dans l'instruction switch, vous devez utiliser uniquement le nom constant.
la source