2016-01-29 73 views
2

也許有人可以填補我的理解的差距: 我有一個看起來像這樣的枚舉:枚舉不能得到解決

enum MyEnum { 

    VALUE_1("id1", "name"), 
    VALUE_2("id2", "name") 

    ... 
} 

當我做這在我的代碼,它工作正常:

if(MyEnum.VALUE_1.getId().equals(someVar)) { 

} 

但這不編譯

switch (someVar) { 

    case MyEnum.VALUE_1.getId(): 
    ... 
} 

IDE抱怨MyEnum無法解析。

這是爲什麼?

回答

2

您正在嘗試使用的情況下表達,這是Java非法的方法調用的結果,因爲案件的標籤需要常量表達式,它可以在編譯時得到解決。方法調用的結果不是一個常量表達式,所以它不能用作案例標籤。

您必須使用您的if聲明;它不需要一個常量表達式。

+0

謝謝您的評論,我從來不知道這一點。 +1 –

0

必須的case標籤中使用常量,因此方法調用是不允許的。然而,爲了能夠使用switch語句和使代碼有點更具可讀性,你可以實現這樣的事情:

enum MyEnum { 

    VALUE_1("id1", "name"), 
    VALUE_2("id2", "name"), 
    ... 

    private static final Map<String, MyEnum> instances = new HashMap<>(); 

    static { 
     for (MyEnum myEnum : values()) { 
      instances.put(myEnum.getId(), myEnum); 
     } 
    } 

    public static MyEnum getById(String id) { 
     return instances.get(id); 
    } 
} 

然後你可以使用該實用程序getById方法時,你需要得到相應的枚舉例如,在提供的ID中,例如在switch語句中:

switch (MyEnum.getById(someVar)) { 
    case VALUE_1: 
    ... 
}