2011-12-05 102 views
5

我的枚舉是這樣目前:設置枚舉值,並解析字符串得到一個枚舉

public enum Manufacturers { 
    Honda, 
    GM, 
    Toyota, 
    Ferrari 
} 

我需要做此創建一個HashMap所以打算,這是正確的?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

即我將使用enumInstance.ordinal()

而且存儲的關鍵,我需要能夠解析這將是枚舉的序號值的字符串,並得到一個枚舉回:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

上面給了我一個錯誤(字符串是「1」)。這是正確的方法嗎?我想我應該有一個嘗試/抓住在那裏嗎?

回答

2

.valueOf實際上會期望字符串「GM」(對於1)。

至於將枚舉值存儲在地圖中,請使用專爲此設計的EnumMap - 並且速度也會很快。

如果你真的想通過它的序數引用一個值,請使用類似Manufacturers.values()[1]的東西。

+0

我似乎無法明確設置序數值,我試過:GM(「5」),豐田(「6」) – Blankman

+1

不,你不能設置它們 - 序號將與值在枚舉中聲明。 – ziesemer

+1

如果由於某種原因,您需要與枚舉的每個元素(除了自動分配的序數)相關聯的不同'int'數字,您可以隨時將其作爲屬性添加到枚舉中,以及getters –

2

一個建議:更好地利用name()得到枚舉的String,每當你需要回到原來的Enum從它,使用valueOf()方法 - 自valueOf()預計,不作爲參數的序數。例如:

enum Example {ONE, TWO}; 

String name = Example.ONE.name(); 
Example e = Example.valueOf(Example.class, name); // e has value ONE 

如果你一定要使用順序,該ordinal()方法將返回你可以用它來檢索由values()方法返回的數組各自Enum的索引。就像這樣:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

正如已經指出的那樣,考慮使用EnumMap,如文檔中表示,這是

與枚舉類型鍵一起使用的專用Map實現。枚舉映射中的所有鍵必須來自單個枚舉類型,該映射在創建映射時明確或隱含地指定。枚舉映射在內部表示爲數組。這種表示非常緊湊和高效。

EDIT

如果需要一個不同的代碼(比其自動分配序其他)的枚舉的每個元素相關聯,可以隨時將其與添加作爲枚舉的屬性,一起getter和setter,像這樣:

public enum Manufacturers { 

    Honda(10), 
    GM(20), 
    Toyota(30), 
    Ferrari(40); 

    private int code; 

    Manufacturers(int code) { 
     this.code = code; 
    } 

    public int getCode() { 
     return code; 
    } 

    public void setCode(int code) { 
     this.code = code; 
    } 

} 

例如:

Manufacturers m = Manufacturers.Honda; 
System.out.println(m.getCode()); // prints 10 
m.setCode(100); 
System.out.println(m.getCode()); // prints 100 

請注意,您將無法從code屬性重建Enum對象,因爲這是由程序員定義的。

+0

,所以你只能使用名字而不是序號進行強制轉換? – Blankman

+0

這是正確的,只使用序號檢索枚舉,使用'values()'。我用代碼示例更新了我的答案。 –