2011-12-05 65 views
5

我的枚举是这样目前:设置枚举值,并解析字符串得到一个枚举

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”)。这是正确的方法吗?我想我应该有一个尝试/抓住在那里吗?

回答

2

.valueOf实际上会期望字符串“GM”(对于1)。

至于将枚举值存储在地图中,请使用专为此设计的EnumMap - 并且速度也会很快。

如果你真的想通过它的序数引用一个值,请使用类似Manufacturers.values()[1]的东西。

+0

我似乎无法明确设置序数值,我试过:GM(“5”),丰田(“6”) – Blankman

+1

不,你不能设置它们 - 序号将与值在枚举中声明。 – ziesemer

+1

如果由于某种原因,您需要与枚举的每个元素(除了自动分配的序数)相关联的不同'int'数字,您可以随时将其作为属性添加到枚举中,以及getters –

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()方法将返回你可以用它来检索由values()方法返回的数组各自Enum的索引。就像这样:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

正如已经指出的那样,考虑使用EnumMap,如文档中表示,这是

与枚举类型键一起使用的专用Map实现。枚举映射中的所有键必须来自单个枚举类型,该映射在创建映射时明确或隐含地指定。枚举映射在内部表示为数组。这种表示非常紧凑和高效。

EDIT

如果需要一个不同的代码(比其自动分配序其他)的枚举的每个元素相关联,可以随时将其与添加作为枚举的属性,一起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 

请注意,您将无法从code属性重建Enum对象,因为这是由程序员定义的。

+0

,所以你只能使用名字而不是序号进行强制转换? – Blankman

+0

这是正确的,只使用序号检索枚举,使用'values()'。我用代码示例更新了我的答案。 –