我的枚举目前是这样的:
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”)。这是正确的方法吗?我想我应该有一个尝试/捕获吗?
答案 0 :(得分:2)
.valueOf
实际上期待字符串“GM”(1)。
至于将枚举值存储在地图中,请使用专为此设计的EnumMap
- 并且也会快速使用它。
如果您真的想通过序号引用某个值,请使用Manufacturers.values()[1]
之类的内容。
答案 1 :(得分: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()
方法将返回一个索引,您可以使用该索引从Enum
方法返回的数组中检索相应的values()
。像这样:
int ordinal = Example.ONE.ordinal();
Example e = Example.values()[ordinal]; // e has value ONE
正如已经指出的那样,考虑使用EnumMap
,如文档中所述,它是
用于枚举类型键的专用Map实现。枚举映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表现非常紧凑和高效。
修改强>
如果你需要将不同的代码与枚举的每个元素相关联(除了它自动分配的序号),你总是可以将它作为属性添加到枚举,以及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
请注意,您将无法从Enum
属性重建code
对象,因为这是由程序员定义的。