2013-05-08 23 views
6

Esiste un modo per convertire un enum in un'espressione costante? Voglio che il mio operatore di interruttore per scegliere tra i valori di un enum, ma ho avuto un errore di compilazione "espressioni case devono essere espressioni costanti", così ho provato a dichiarare in una variabile:Espressioni costanti da un Enum

final int REG = MyEnum.REG.getIndex().intValue(); 

switch (service.getIndex()) { 

case REG: 

Ma ancora ottieni lo stesso errore Secondo la documentazione di Oracle http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

Una fase di compilazione espressione costante è un'espressione che denota un valore di tipo primitivo o una stringa che non completano bruscamente ed è composta utilizzando solo il seguente:

• letterali di tipo primitivo e letterali di tipo Stringa

Quindi non funziona perché non sto utilizzando un letterale. Penso che dovrò dichiararlo come:

final int REG = 8; 

Ma sarebbe molto meglio collegarlo all'enum. C'è un modo per farlo?

EDIT

Risulta Non ho bisogno di usare qualsiasi variabile finale. È semplice come:

switch (service) { 

case REG: 

Non mi è venuto in mente finché non ho visto il commento di Andrea. Grazie per le tue risposte.

+1

Suppongo che 'service.getIndex()' restituisce 'Integer ', giusto? Puoi modificarlo in modo che restituisca il tuo enum? –

+1

Fino a Java 1.6 non è possibile utilizzare 'String' in' switch-case', ma è possibile utilizzarlo in Java 7. FYI – Joshi

risposta

6

Se possibile, modificare il metodo getIndex() in modo che restituisca un enum anziché un numero intero. Se questo non è possibile, è necessario mappa l'indice di un elemento enum:

Data la seguente enum:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

è possibile mappare l'indice a un elemento enum utilizzando

Index.values()[index] 

Dato il metodo Integer getIndex(), quindi è possibile fare qualcosa di simile

switch(Index.values()[getIndex()]) 
    case ONE : ... 
     break; 

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

Si noti che questo potrebbe generare un ArrayIndexOutOfBoundsException se si tenta di accedere a un indice all'interno dell'enum che è maggiore del numero di elementi enum (ad es. nell'esempio sopra riportato, se getIndex() restituisce un valore> 2).


avrei incapsulare l'espressione Index.values()[getIndex()] in un metodo enum come valueOf(int index), simile al default valueOf(String s). È quindi possibile gestire anche il controllo dell'indice array valido lì (e, ad esempio, restituire un valore enum speciale se l'indice è fuori intervallo).Allo stesso modo, è possibile anche convertire valori discreti che hanno un significato speciale:

public enum Index { 
    ZERO, 
    ONE, 
    TWO, 
    THREE, 
    REG, 
    INVALID; 


    public static Index valueOf(int index) { 

     if (index == 8) { 
      return REG; 
     } 

     if (index >= values().length) { 
      return INVALID; 
     } 

     return values()[index]; 
    } 
} 

Questo è solo un esempio - in ogni caso, in generale dipende l'intervallo di valori si ottiene dal tuo metodo getIndex(), e come si desidera per mapparli agli elementi enum.

È quindi possibile utilizzarlo come

switch(Index.valueOf(service.getIndex())) { 
    case ZERO : ... break; 
    ... 
    case REG : ... break; 
    ... 
} 

Vedi anche Cast Int to enum in Java per alcune informazioni aggiuntive (in particolare il suggerimento che values() è un'operazione costosa in quanto ha bisogno di restituire una copia della matrice ogni volta che è chiamato).

+0

Ha funzionato per me! Molte grazie! – Mauker

2

Se si desidera valori numerici specifici assegnati a constacts enum andare così

enum MyReg { 
    REG(8), OTHER(13); 

    public final int value; 
    MyReg(int value) { 
     this.value=value; 
    } 
} 

È quindi possibile utilizzare in questo modo:

class Test { 
    public static void main(String[] args) { 
     MyReg reg = MyReg.REG; 
     switch (reg) { 
     case OTHER: 
      System.out.println(reg.value); 
      break; 
     case REG: 
      System.out.println(reg.value); 
      break; 
     } 
    } 
} 
Problemi correlati