Java:使用枚举作为数组引用
我想引用枚举类型的数组。这是C++中的一个非常标准的东西(我的原点),但是我不确定java中是否有可能。 例如,我想要一个枚举,例如:Java:使用枚举作为数组引用,java,arrays,enums,Java,Arrays,Enums,我想引用枚举类型的数组。这是C++中的一个非常标准的东西(我的原点),但是我不确定java中是否有可能。 例如,我想要一个枚举,例如: public enum Resource { COAL, IRON } 那么稍后我想引用这样的内容: Amount[COAL] // The amount of coal Price[IRON] // The price of iron 我不想在Resource中设置Amount和Price字段,因为我想要一个按资源类型分组的对象(资源订单
public enum Resource {
COAL,
IRON
}
那么稍后我想引用这样的内容:
Amount[COAL] // The amount of coal
Price[IRON] // The price of iron
我不想在Resource
中设置Amount
和Price
字段,因为我想要一个按资源类型分组的对象(资源订单)列表。手动将int分配给每种类型的资源
并不比公共静态int final废话好多少
我觉得什么也得不到
本质上,我在寻找C++标记的枚举。我意识到这可能是java中错误的做事方式,所以请随意给我指出正确的java精神的方向。C++中的< /P> < P> >,枚举实际上是整数的别名。在Java中,它们是“适当的”对象——这就是为什么不能将它们用作数组引用的原因 如果您想在数组中查找与特定枚举对象关联的值,我觉得这就像一个映射!用
EnumMap
替换这些数组怎么样
该类经过优化,可与枚举键一起使用,因此它最终会在幕后使用对枚举的序数(整数)值进行键控的数组。因此,它比通用hashmap快得多,而且您可以获得基于数组的解决方案的速度,它具有
映射的语义表达能力,这是两全其美。不幸的是,您需要稍微长一点的语法:
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;
}
希望有帮助。你几乎可以做到。与C++相比, EnUM<代码>只是一个<代码> int >代码>,java的<代码>枚举< /Cord>是类。所以不能将其用作数组的索引。但是每个enum元素都有ordinal()
,即int,因此可以这样说
amount[COAL.ordinal()]
price[IRON.ordinal()]
但你有更好的方法。可以将方法添加到枚举,因此其外观如下:
IRON.price(amounts)
COAL.amount(prices)
我认为这种方法更好。我认为您正在寻找EnumMap
它不完全是一个数组,但因为键是一个枚举,所以它仍然节省空间
结果是:
amount.get(Resource.COAL)每个Java枚举元素都有一个与其关联的序号,根据枚举中的定义顺序从零开始索引。只要使用例如
COAL.ordinal()
但是,在我看来,您最好创建一个类,例如带有金额和价格字段的Order,然后保留这些字段的集合,例如在由枚举元素索引的映射中
e、 g
Map orders=newhashmap();
下单(资源、煤炭、新订单(价格、金额));
地图非常适合用于更动态的数据。但是您还必须编写所有检查双名称、双值、现有名称/值以及所有内容的代码。即使在这种情况下,如果您执行了错误,也只能在运行时找到它
要获得更多静态数据,最好不要使用基本枚举,而是使用。他们太棒了!编译器将发现错误
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;
}
啊!这正是我想要的,非常感谢!您确实不应该使用ordinal()
-如果要在枚举中添加另一个字段,或者甚至按字母顺序对其重新排序,您的代码将中断,并且几乎无法找出原因。Map
是一个更优雅、更像Java的解决方案。。。但它回答了Cramer提出的问题。它(有点)回答了,但它也是“Java中‘错误’的做事方式”。
for(Resource resourceType: Resource.values()) {
String toOutput=resourceType.name()+" amount="+ resourceType.amount;
}