2010-04-14 47 views
1

我想完成類似以下任務(我的興趣在toInt()方法中)。有沒有本地的方式來完成這個?如果沒有,我怎麼能得到與枚舉值相關的整數(如在C#中)?試圖在Java中運行時從Enum獲取關聯值

enum Rate { 
VeryBad(1), 
Bad(2), 
Average(3), 
Good(4), 
Excellent(5); 

private int rate; 

private Rate(int rate) { 
    this.rate = rate; 
} 

public int toInt() { 
    return rate; 
} 
} 

感謝

回答

0

的Java枚舉不喜歡C#枚舉。它們是對象,而不僅僅是一個整型常量的名稱。你可以做的最好的辦法是查看對象的哈希碼,但是這不會給你任何真正有意義/有用的信息,因爲我相信你正在尋找。唯一真正的方法就是在你的示例代碼中爲枚舉賦予一個屬性並且使用它來訪問它(通過方法或公共final字段)。

+0

但如何實現的方法?我的toInt()據我所知可能無法在java中工作。我沒有辦法調用它。 – 2010-04-14 15:49:14

+0

您可以將它稱爲枚舉值本身:Rate.Excellent.toInt(),或者如果您要將場率設置爲公開(並且風格也是最後的),則可以使用Rate.Excellent.rate。 – 2010-04-14 17:52:06

0
return enumVal.ordinal(); 

(見javadoc

編輯:我原來是看錯你的代碼;當Java處理所有這些時,您似乎手動執行所有int/enum轉換。你真的不需要使用整數,你可以使用枚舉作爲一個單獨的類型。正如javadoc所說的那樣,你不可能真正想要與特定值相關聯的int; 「好」和「4」彼此沒有任何聯繫,4只是恰好是它在枚舉中的位置

+0

如果我有一組評價對象,我會想知道平均費用是多少。因此,將它們作爲整數操作不僅是一個優點,而且是一種必要性。 – 2010-04-14 14:50:34

0

不知道這是否回答你的問題,但枚舉實例有一個ordinal()方法返回它的定位爲整數。但它是不好的做法,依靠它,因爲在你的例子所示的實例字段是要走的路...

2

在「有效的Java」約書亞布洛赫建議以下模式:

private static final Map<Integer, Rate> intToEnum = new HashMap<Integer, Rate>(); 
static 
{ 
    for(Rate rate: values()) 
     intToEnum.put(Integer.valueOf(rate.toInt()), rate); 
} 
public static Rate fromInt(int intVal) 
{ 
    return intToEnum.get(Integer.valueOf(intVal)); 
} 
+0

他還建議避免使用'ordinal()',因爲「大多數程序員對此方法沒有用處。」 http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal%28%29 – trashgod 2010-04-14 14:24:06

+0

放置內枚舉,偉大的事情! – 2010-05-07 13:07:12

+0

但是在這裏定義'public int toInt(){return ordinal()+ 1;}'完成這項工作。不管有什麼原因可以避免ordinal(),在enum類中它們是無效的。 – maaartinus 2011-01-24 15:22:12

0

由於枚舉在Java中被視爲一個對象。爲了讓您的枚舉關聯的值ofrrate只寫了下面的代碼

return enumValue.toInt(); 

在存儲當前枚舉實例這種情況下enumValue。因此,例如

Rate enumValue = Rate.Good; 
enumValue.toInt(); // return value 4; 

另外,如果你想知道什麼是它的序號,然後返回enumValue.ordinal(); 但是,在給一個枚舉賦值之後,我不明白爲什麼你需要它的序號。