2012-04-15 3 views
157

D'abord, je vais dire que je suis beaucoup plus familier avec les enums en C# et il semble que les enums en java soient un désordre.Java: utilisation de l'instruction switch avec enum sous-classe

Comme vous pouvez le voir, j'essaie d'utiliser une instruction switch @ enums dans mon exemple suivant, mais je reçois toujours une erreur, peu importe ce que je fais.

L'erreur que je reçois est:

L'étiquette cas qualifié SomeClass.AnotherClass.MyEnum.VALUE_A doit être remplacé par des personnes non qualifiées ENUM constante VALUE_A

La chose est que je tout à fait comprendre l'erreur mais je ne peut pas écrire simplement VALUE_A puisque l'enum est situé dans une autre sous-classe. Y a-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; 
      } 
     } 
    } 
} 
+0

Comme darrengorman a commenté, Java [ 'Enum'] (http://docs.oracle.com/javase/8/ docs/api/java/lang/Enum.html) sont * extrêmement * pratiques une fois que vous avez compris - pas du tout un gâchis. Ils sont beaucoup plus flexibles et pratiques que de simples enums (simplement une valeur entière étiquetée) comme on le voit sur d'autres plateformes. Voir le [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Découvrez les implémentations 'Set' /' Map' optimisées: ['EnumSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html) & [' EnumMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html). –

+0

Lorsque vous essayez de qualifier l'instruction case; D'une certaine manière, vous essayez de dire que je peux mélanger différents types d'énumérations (et pas seulement le même type enum) dans une seule instruction switch. Java l'a arrêté avec cette approche comme discuté ici http://www.digizol.com/2010/10/enum-case-label-switch-java-qualified.html – lkamal

Répondre

362

Modifier à ceci:

switch (enumExample) { 
    case VALUE_A: { 
     //.. 
     break; 
    } 
} 

L'indice est dans l'erreur. Vous n'avez pas besoin de qualifier les étiquettes case avec le type enum, juste sa valeur.

+13

Ok je me sens si stupide :-( Vous avez tout à fait raison, j'étais convaincu que j'ai essayé cette ligne exacte et j'ai eu une erreur avec ça, donc je me suis déplacé pour qualifier le cas, mais votre suggestion fonctionne .. – Popokoko

+4

Par ailleurs, je pense que vous Je trouve que les enums en Java sont incroyablement utiles une fois que vous commencez à les utiliser plus, je ne dirais pas qu'ils sont un désordre du tout :) – darrengorman

+0

Je crois que je vais trouver que vous avez raison dans un proche avenir :) En tout cas, c'est certainement le meilleur forum de programmation autour grâce à des gens comme vous. – Popokoko

21

Java infère automatiquement le type des éléments dans case, de sorte que les étiquettes doivent être sans réserve.

int i; 
switch(i) { 
    case 5: // <- integer is expected 
} 
MyEnum e; 
switch (e) { 
    case VALUE_A: // <- an element of the enumeration is expected 
} 
+8

Pourquoi _must_-il être non qualifié? –

+8

Si vous pouviez vous qualifier, vous pourriez utiliser autre chose que MyEnum, ce qui n'aurait aucun sens. – Kru

+0

@Kru, mais je ** peux ** utiliser quelque chose grammaticalement, sinon pour les expressions de cas non énumérées. Par exemple.'statique final int MY_CONST = 7; ...; switch (intVariable) {case MY_CONST: ...;} 'au lieu de' case 7'. Donc, cette restriction pour enums n'a pas de sens (je peux utiliser non seulement des littéraux primaires, mais aussi des constantes définies manuellement pour l'expression integer 'switch', mais je ne peux pas utiliser de constantes définies manuellement, mais seulement des noms primaires pour enums). – Sasha

0

Ecrire someMethod() de cette façon:

public void someMethod() { 

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A; 

    switch (enumExample) { 
    case VALUE_A: 
     break; 
    } 

} 

Dans l'instruction switch vous devez utiliser uniquement le nom constant.

2

cela devrait faire:

//Main Class 
public class SomeClass { 

    //Sub-Class 
    public static class AnotherClass { 
     public enum MyEnum { 
      VALUE_A, VALUE_B 
     }  
     public MyEnum myEnum; 
    } 

    public void someMethod() { 
     AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //... 

     switch (enumExample) { 
      case VALUE_A: { //<-- error on this line 
      //.. 
      break; 
      } 
     } 
    } 
} 
0

Voici comment je l'utilise. Et cela fonctionne fantastiquement -

public enum Button { 
     REPORT_ISSUES(0), 
     CANCEL_ORDER(1), 
     RETURN_ORDER(2); 

     private int value; 

     Button(int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 
    } 

Et le switch-case comme indiqué ci-dessous

@Override 
public void onClick(MyOrderDetailDelgate.Button button, int position) { 
    switch (button) { 
     case REPORT_ISSUES: { 
      break; 
     } 
     case CANCEL_ORDER: { 
      break; 
     } 
     case RETURN_ORDER: { 
      break; 
     } 
    } 
}