2013-05-08 4 views
6

Gibt es eine Möglichkeit, ein Enum in einen konstanten Ausdruck zu konvertieren? Ich möchte meinen Schalter Betreiber unter den Werten eines Enum wählen, aber ich habe einen Compiler-Fehler „case-Ausdrücke konstante Ausdrücke sein muss“, also versuchte ich es in einer Variablen zu deklarieren:Konstante Ausdrücke aus einem Enum

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

switch (service.getIndex()) { 

case REG: 

Aber ich immer noch bekomme den gleichen Fehler. Laut Oracle Dokumentation http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

Ein Kompilierung-Konstante Ausdruck ist ein Ausdruck einen Wert primitiver Typ oder ein String bezeichnet, die nicht abrupt nicht vervollständigt und ist nur die zusammengesetzt mit folgenden:

• Literale von primitiven Typ und Literalen des Typs String

So funktioniert es nicht, weil ich kein Literal verwende. Ich denke, ich muss es als zu erklären:

Aber es wäre viel besser, es mit dem Enum zu verknüpfen. Gibt es eine Möglichkeit, dies zu tun?

EDIT

Stellt sich heraus, ich habe keine endgültige Variable verwenden müssen. Es ist so einfach wie:

switch (service) { 

case REG: 

Es kam mir nicht in den Sinn, bis ich Andreas Kommentar sah. Danke für deine Antworten.

+1

Ich gehe davon aus, dass 'service.getIndex()' 'kehrt Integer ', oder? Kannst du es so modifizieren, dass es dein enum zurückgibt? –

+1

Bis Java 1.6 können Sie 'String' nicht in' switch-case' verwenden, aber Sie können es in Java 7 verwenden. FYI – Joshi

Antwort

6

Wenn möglich, ändern Sie Ihre getIndex() Methode, so dass es ein Enum anstelle einer ganzen Zahl zurückgibt. Wenn dies nicht möglich ist, müssen Sie Karte der Index auf ein Aufzählungselement:

folgende Aufzählungstyp:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

Sie Ihren Index zu einem Enum Element zuordnen kann durch

Index.values()[index] 
mit

Angesichts Ihrer Methode Integer getIndex(), können Sie dann wie

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

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

Beachten Sie, dass dies eine ArrayIndexOutOfBoundsException werfen könnte, wenn Sie versuchen, auf einen Index innerhalb der Enumeration zuzugreifen, der größer ist als die Anzahl der Enumerationselemente (z. im obigen Beispiel, wenn getIndex() einen Wert> 2 zurückgibt.


würde ich den Ausdruck Index.values()[getIndex()] in eine ENUM-Methode wie valueOf(int index), ähnlich wie der Standard valueOf(String s) einzuzukapseln. Sie können dann auch den gültigen Array-Index-Check dort behandeln (und zum Beispiel einen speziellen Enum-Wert zurückgeben, wenn der Index außerhalb des Bereichs liegt).Ebenso können Sie dann auch diskrete Werte umwandeln, die eine besondere Bedeutung haben:

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

Dies ist ein Beispiel nur - in jedem Fall ist es in der Regel abhängig Bereich von Werten, die Sie von Ihrem getIndex() Methode erhalten, und wie Sie wollen um sie den Enum-Elementen zuzuordnen.

können Sie dann verwenden, wie

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

Siehe auch Cast Int to enum in Java für einige zusätzliche Informationen (insbesondere der Hinweis, dass values() ist eine teure Operation, da sie es jedes Mal eine Kopie des Arrays zurückgeben muss wird genannt).

+0

Es hat bei mir funktioniert! Danke vielmals! – Mauker

2

Wenn Sie bestimmte Zahlenwerte auf Enum constacts zugewiesen werden soll gehen wie diese

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

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

Sie es dann wie folgt verwenden:

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