2015-04-16 126 views
-5

我有這樣的枚舉類:如何將「值」轉換爲枚舉?

public enum IconImageTag { 

    None("val1"), 
    USD("val2"), 
    EURO("val3"); 
} 

賦予其代表"value"(說`「VAL」 1)

我怎樣才能將其轉換爲相應的枚舉一個字符串?

更新

我已經試過這一點。爲什麼從ctor訪問靜態成員是非法的?我收到一個錯誤。

private final String value; 
    private static final Map<String, IconImageTag> stringToEnumMap = new HashMap<>(); 

    IconImageTag(String value) { 
     this.value = value; 
     stringToEnumMap.put(value, this); 
    } 
+2

檢查此鏈接:http://stackoverflow.com/questions/604424/java-convert-string-to-enum的 –

+0

可能重複[我怎樣才能從查找的字符串值的Java枚舉?( http://stackoverflow.com/questions/1080904/how-can-i-lookup-a-java-enum-from-its-string-value) – Casey

+0

你確定這些值是屬於枚舉還是應該在一些轉換器在別的地方? –

回答

5

理想情況下,您將構建一個Map<String, IconImageTag>並添加一個適當的方法。例如:

public enum IconImageTag { 
    NONE("val1"), 
    USD("val2"), 
    EURO("val3"); 

    private final String value; 

    private final Map<String, IconImageTag> valueMap = new HashMap<>(); 

    static { 
     for (IconImageTag tag : values()) { 
      valueMap.put(tag.value, tag); 
     } 
    } 

    private IconImageTag(String value) { 
     this.value = value; 
    } 

    public static IconImageTag fromValue(String value) { 
     return valueMap.get(value); 
    } 
} 

(我可能會使用不同的術語,從「價值」在這裏,爲了避免混淆與valueOf()等)

注意使用靜態初始化塊 - 任何靜態enum中的變量初始化爲枚舉值本身,這意味着當枚舉構造函數運行時,valueMap仍然爲空。

+0

第二個問題是:這個邏輯應該在枚舉中嗎?這些「價值」真的是枚舉的一部分,還是會有不同的集合呢? –

+0

是的。很明顯,這是一個更好的答案。 – ApolloSoftware

+0

他們是貨幣的翻譯到另一個語言 –

0

您也可以迭代每個枚舉。

public enum IconImageTag { 

None("val1"), 
USD("val2"), 
EURO("val3"); 

private final String value; 
private IconImageTag(String value) { 
    this.value = value; 
} 

public String getValue() { 
    return value; 
} 

public static IconImageTag getByValue(String value) { 
    for(IconImageTag iconImageTag : values()) { 
    if(iconImageTag.getValue().equals(value)) { 
     return iconImageTag; 
    } 
    } 
    return null; 
}