2012-02-23 83 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; 
}