2013-05-08 61 views
6

有什麼方法可以將枚舉轉換爲常量表達式? 我希望我的開關操作,以枚舉值中進行選擇,但我得到一個編譯錯誤「CASE表達式必須是常量表達式」,所以我試圖將它聲明一個變量:Enum的常量表達式

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

switch (service.getIndex()) { 

case REG: 

但我仍然得到相同的錯誤。根據Oracle的文檔http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

編譯時常量表達式是一個表達式表示原始類型或字符串的值 不突然完成並是 僅使用由下列:

•字面原始類型和文字類型字符串

所以它不工作,因爲我沒有使用文字。我想我將不得不聲明它:

final int REG = 8; 

但它將是更好的鏈接到枚舉。有沒有辦法做到這一點?

編輯

原來我不需要使用任何最終的變量。它就這麼簡單:

switch (service) { 

case REG: 

直到我看到安德烈的評論,我纔沒有想到它。感謝您的回答。

+1

我假定'service.getIndex()''返回整數',對嗎?你可以修改它,讓它返回你的枚舉? – 2013-05-08 10:35:25

+1

直到Java 1.6,你不能在'switch-case'中使用'String',但你可以在Java 7中使用它。FYI – Joshi 2013-05-08 10:37:21

回答

6

如果可能,請修改您的getIndex()方法,使其返回枚舉而不是整數。如果這是不可能的,你需要地圖索引來枚舉元素:

給出下面的枚舉:使用

Index.values()[index] 

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

您可以將索引映射到一個枚舉元素

鑑於你的方法Integer getIndex(),然後你可以做這樣的事情

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

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

請注意,如果您嘗試訪問大於枚舉元素數的枚舉中的索引(例如,枚舉),則可能會拋出ArrayIndexOutOfBoundsException。在上面的示例中,如果getIndex()返回值> 2)。


我將封裝表達Index.values()[getIndex()]到像valueOf(int index),類似於默認valueOf(String s)枚舉方法。然後您可以在那裏處理有效的數組索引檢查(例如,如果索引超出範圍,則返回一個特殊的枚舉值)。同樣,您可以也轉換有特殊含義的離散值:

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

這只是一個例子 - 在任何情況下,這通常取決於你從你的getIndex()方法得到的值的範圍,以及如何你想將它們映射到枚舉元素。

然後,您可以使用它像

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

又見Cast Int to enum in Java了一些額外的信息(尤其是暗示values()是昂貴的操作,因爲它需要每次都返回數組的副本它叫做)。

+0

它對我很有用!非常感謝! – Mauker 2015-07-14 15:13:04

2

如果你想分配給枚舉constacts具體數值是這樣的

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

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

然後使用它是這樣的:

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