2013-05-08 18 views
6

Czy istnieje sposób zamiany wyliczenia na wyrażenie stałe? chcę mój operator przełącznik wyboru spośród wartości wyliczenia, ale mam błąd kompilacji „wyrażenia przypadek musi być stała wyrażeń”, więc starałem się zadeklarować ją w zmiennej:Wyrażenia stałe z Enum

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

switch (service.getIndex()) { 

case REG: 

ale nadal pojawia się ten sam błąd. Według dokumentacji Oracle http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

kompilacji czasu stała ekspresja jest wyrazem oznaczającym wartość prymitywnego typu lub ciąg znaków, który nie kończy się nagle i jest składa się przy użyciu wyłącznie:

• literale typu pierwotnego i literałów typu String

Nie działa, ponieważ nie używam literału. Myślę, że będę musiał zadeklarować to jako:

final int REG = 8; 

Ale byłoby znacznie lepiej połączyć to z wyliczeniem. Czy jest jakiś sposób na zrobienie tego?

EDIT

Okazuje się, że nie trzeba używać żadnej zmiennej końcowego. To jest tak proste, jak:

switch (service) { 

case REG: 

Nie przyszło mi to do głowy, dopóki nie zobaczyłem komentarza Andrei. Dziękuję za odpowiedzi.

+1

Zakładam, że 'service.getIndex()' 'Integer powroty ', prawda? Czy możesz zmodyfikować to tak, aby zwracało twoje wyliczenie? –

+1

Do wersji 1.6 nie można używać 'String' w' switch-case', ale można go używać w Javie 7. FYI – Joshi

Odpowiedz

6

Jeśli to możliwe, zmodyfikuj metodę getIndex() tak, aby zwracała wyliczenie zamiast liczby całkowitej. Jeśli nie jest to możliwe, trzeba mapie indeks do elementu ENUM:

otrzymuje następujące wyliczenia:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

można mapować indeksu do elementu enum przy użyciu

Index.values()[index] 

Biorąc metoda Integer getIndex() można wtedy zrobić coś takiego

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

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

Pamiętaj, że może to spowodować wyświetlenie ArrayIndexOutOfBoundsException, jeśli spróbujesz uzyskać dostęp do indeksu w wyliczeniu, który jest większy niż liczba elementów wyliczeniowych (np. w powyższym przykładzie, jeśli getIndex() zwraca wartość> 2).


bym hermetyzacji ekspresję Index.values()[getIndex()] do metody enum jak valueOf(int index), podobnego do domyślnego valueOf(String s). Możesz wtedy również obsłużyć tam ważny indeks indeksu tablicy (i na przykład zwrócić specjalną wartość wyliczenia, jeśli indeks jest poza zakresem).Podobnie, można wtedy również konwertować wartości dyskretnych, które mają szczególne znaczenie:

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

to tylko przykład - w każdym razie, to na ogół zależy od zakresu wartości otrzymuje się od sposobu getIndex(), i jak chcesz zmapować je do elementów enum.

Można następnie używać go jak

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

Zobacz także Cast Int to enum in Java do dodatkowych informacji (w szczególności wskazówkę, że values() to operacja kosztowna, gdyż musi powrócić kopię tablicy za każdym razem jest nazywany).

+0

To działało dla mnie! Wielkie dzięki! – Mauker

2

Jeśli chcesz konkretne wartości liczbowe przypisane do constacts enum pójść jak ten

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

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

następnie użyć go tak:

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