2012-02-23 101 views
5

我想引用一個陣列枚舉類型。這在C++(我的出處)中是非常標準的東西,但是我不確定這在Java中是否可行。爪哇:使用一個枚舉作爲數組參考

例如,我想有一個枚舉,如:

public enum Resource { 
    COAL, 
    IRON 
} 

後來的後來,我想引用這樣的:

Amount[COAL] // The amount of coal 
Price[IRON] // The price of iron 

我不想讓AmountPriceResource字段,因爲我想按資源類型分組的對象列表(資源訂單)。手動爲每種類型的Resource分配一個int並不比public static int final BLAH好,我感覺沒有任何好處。

從本質上說,我在尋找C的枚舉++這些標籤的事情。我意識到這可能是在Java中做事的'錯誤'方式,所以請隨時指出我正確的Java風格的方向。

回答

12

在C++中,枚舉有效爲一個整數的別名。在Java中,它們是「合適的」對象 - 這就是爲什麼你不能將它們用作數組引用。

如果你想要查找的數值的陣列與一個特定的枚舉對象關聯的 - 這聽起來像一個地圖給我!如何用EnumMap<Resource, Double>替換這些陣列?

EnumMap類爲使用枚舉鍵而進行了優化,因此它最終會使用鍵值在枚舉的序幕(整數)值後面的數組。所以它比通用hashmap快得多,並且您可以獲得基於數組的解決方案的速度,並且具有Map的語義表達能力 - 這是兩全其美的。

+0

唉唉!這正是我想要的,非常感謝! – Cramer 2012-02-23 09:35:46

-1

不幸的是,你需要稍長的語法:

Amount[COAL.ordinal()] // The amount of coal 
Price[IRON.ordinal()] // The price of iron 

如果不是根據自己的喜好,常數可能是你唯一的選擇,即

public class Resource { 
    public static final int COAL = 0; 
    public static final int IRON = 1; 

} 

希望有所幫助。

+1

你真的不應該使用'ordinal()' - 如果要在'enum'中添加另一個字段,或者甚至按字母順序對它進行重新排序,你的代碼將會中斷,並且幾乎不可能找出原因。 「Map」是一個更加優雅和類似Java的解決方案。 – Marcelo 2012-02-23 09:37:15

+0

也許不是......但它回答了Cramer的問題。 – 2012-02-23 09:40:57

+0

它(類)有,但它也是*「在Java中做事的'錯誤的方式」*。 – Marcelo 2012-02-23 09:42:33

1

你幾乎可以做到這一點。相比於C++,其中enum只是一個int,Java的enum是一流的。所以你不能用它作爲數組的索引。但是,每一個枚舉元素具有ordinal()是int型,因而可以說

amount[COAL.ordinal()] 
price[IRON.ordinal()] 

但你有一個更好的辦法。可以添加方法枚舉,所以它看起來像:

IRON.price(amounts) 
COAL.amount(prices) 

我認爲這種方法好得多。

1

每個Java枚舉元素具有與之相關聯的序,基於定義的在枚舉的順序從0開始索引。只需使用例如

COAL.ordinal() 

然而,這聽起來像你對我會更好,創建一個類如訂購包含金額和價格的字段,然後保存這些字段的集合。在由枚舉元素索引的Map中。

例如

Map<Resource, Order> orders = new HashMap<Resource, Order>(); 
orders.put(Resource.COAL, new Order(price, amount)); 
0

地圖對於更加動態的數據非常有用。但是你也必須編寫雙重名稱,雙值,現有名稱/值和所有東西的所有檢查。即使在這種情況下,如果發生錯誤,它也只會在運行時發現。

對於更多靜態數據更好的使用不是原始枚舉,但是new type enums from Java 6。他們非常棒!編譯器會發現錯誤。

public enum Resource{ 
    COAL(0), IRON(1); 
    int index; 
    private Resource(int index){ 
     this.index=index; 
    } 
} 
... 
amount[Resource.COAL.index]=... 

但更好的方法是:

public enum Resource{ 
    COAL(538,0.5f), IRON(115,1.5f); 
    int amount; 
    float price; 
    private Resource(int amount, float price){ 
     this.amount=amount; 
     this.price=price; 
    } 
} 
... 
Resource.COAL.amount=... 

您可以使用他們的名字。

你可以通過所有枚舉使循環:

for(Resource resourceType: Resource.values()) { 
    String toOutput=resourceType.name()+" amount="+ resourceType.amount; 
}