2012-04-15 13 views
157

Per prima cosa, dichiaro che sono molto più familiare con le enumerazioni in C# e sembra che enum in java sia un bel problema.Java: utilizzo dell'istruzione switch con enum nella sottoclasse

Come potete vedere, sto cercando di utilizzare un'istruzione switch @ enums nel mio prossimo esempio, ma ottengo sempre un errore, non importa quello che sto facendo.

L'errore che ricevo è:

Il caso qualificato etichetta SomeClass.AnotherClass.MyEnum.VALUE_A deve essere sostituito con l'enumerazione qualificato costante VALUE_A

Il fatto è che abbastanza capito l'errore, ma ho non può semplicemente scrivere VALUE_A poiché l'enum si trova in un'altra sottoclasse. c'è un modo per risolvere questo problema? E perché sta succedendo in 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

Come darrengorman commentato, Java [ 'Enum'] (http://docs.oracle.com/javase/8/ docs/api/java/lang/Enum.html) sono * estremamente * a portata di mano una volta capito il problema - non è affatto un disastro. Sono molto più flessibili e pratici di semplici enumerazioni (semplicemente un valore intero etichettato) viste su altre piattaforme. Vedere [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Scopri le implementazioni ottimizzate di 'Set' /' Map': ['EnumSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html) e [' EnumMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html). –

+0

Quando si tenta di qualificare la dichiarazione del caso; in un certo senso, stai cercando di dire che posso mescolare diversi tipi di enumerazione (non solo lo stesso tipo di enum) all'interno di una singola istruzione switch. Java lo ha fermato con questo approccio come discusso qui http://www.digizol.com/2010/10/enum-case-label-switch-java-qualified.html – lkamal

risposta

362

Change a questo:

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

L'indizio è l'errore. Non è necessario qualificare le etichette case con il tipo enum, solo il suo valore.

+13

Ok mi sento così stupido :-( Hai perfettamente ragione, ero convinto di aver provato questa linea esatta e ho ottenuto un errore, così mi sono trasferito per qualificare il caso, ma il tuo suggerimento funziona. – Popokoko

+4

A proposito, penso che tu sia " Scopriremo che le enumerazioni in Java sono incredibilmente utili una volta che inizi ad usarle di più, non direi che sono un disastro :) – darrengorman

+0

Credo che troverò che hai ragione nel prossimo futuro :) Comunque, questo è sicuramente il miglior forum di programmazione in circolazione grazie a persone come te. – Popokoko

21

Java deduce automaticamente il tipo di elementi in case, così le etichette devono essere non qualificato.

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

Perché dovrebbe essere squalificato? –

+8

Se potessi qualificarti, potresti usare qualcos'altro oltre a "MyEnum" che non avrebbe senso. – Kru

+0

@Kru, ma io ** posso ** usare qualcosa grammaticamente-altro per le espressioni del caso non enum-typed. Per esempio.'static final int MY_CONST = 7; ...; switch (intVariable) {case MY_CONST: ...;} 'invece di' caso 7'. Quindi questa restrizione per enumerazione rende ** no ** senso (io posso usare non solo i letterali primari, ma anche le costanti definite manualmente per l'espressione intero 'switch', ma non posso usare costanti definite manualmente, ma solo nomi primari per enumerazioni). – Sasha

0

Scrivi someMethod() in questo modo:

public void someMethod() { 

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

    switch (enumExample) { 
    case VALUE_A: 
     break; 
    } 

} 

In istruzione switch è necessario utilizzare solo il nome della costante.

2

questo dovrebbe fare:

//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

Questo è come mi sto usando. E si sta lavorando fantasticamente -

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

E il switch-case come illustrato di seguito

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