Java 设置枚举值,并解析字符串以获取枚举

Java 设置枚举值,并解析字符串以获取枚举,java,enumeration,Java,Enumeration,我的枚举当前是这样的: public enum Manufacturers { Honda, GM, Toyota, Ferrari } 我需要创建一个Hashmap,所以我计划这样做,对吗 Manufacturers mfg = Manufacturers.Honda; mfg.ordinal() // save as key i、 e.我将使用enumInstance.ordinal()存储密钥 此外,我需要能够解析一个字符串,该字符串将是枚举的序数值,并返回枚举:

我的枚举当前是这样的:

public enum Manufacturers {
  Honda,
  GM,
  Toyota,
  Ferrari
}
我需要创建一个Hashmap,所以我计划这样做,对吗

Manufacturers mfg = Manufacturers.Honda;

mfg.ordinal()  // save as key
i、 e.我将使用
enumInstance.ordinal()存储密钥

此外,我需要能够解析一个字符串,该字符串将是枚举的序数值,并返回枚举:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString);

上面给出了一个错误(字符串是“1”)。这是正确的方法吗?我想我应该试一试,对吗?

.valueOf
实际上应该是字符串“GM”(代表1)

至于在映射中存储枚举值,请使用专门为此而设计的
EnumMap
,而且速度也很快


如果您确实想按序号引用值,请使用类似于
Manufacturers.values()[1]

的方法。建议:最好使用
name()
String
的形式获取枚举的名称,并且无论何时需要从中获取原始的
enum
,请使用
valueOf()
method-因为
valueOf()
需要名称而不是序号作为参数。例如:

enum Example {ONE, TWO};

String name = Example.ONE.name();
Example e = Example.valueOf(Example.class, name);  // e has value ONE
Manufacturers m = Manufacturers.Honda;
System.out.println(m.getCode()); // prints 10
m.setCode(100);
System.out.println(m.getCode()); // prints 100
如果您确实需要使用序号,则
ordinal()
方法将返回一个索引,您可以使用该索引从
values()
方法返回的数组中检索相应的
Enum
。像这样:

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

已经指出的,考虑使用,如文献中所述,它是

用于枚举类型键的专用映射实现。枚举映射中的所有键必须来自在创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表示非常紧凑和高效

编辑

如果需要将不同的代码关联到枚举的每个元素(自动分配的序号除外),则始终可以将其作为属性添加到枚举中,以及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;
    }

}
例如:

enum Example {ONE, TWO};

String name = Example.ONE.name();
Example e = Example.valueOf(Example.class, name);  // e has value ONE
Manufacturers m = Manufacturers.Honda;
System.out.println(m.getCode()); // prints 10
m.setCode(100);
System.out.println(m.getCode()); // prints 100

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

因此您只能使用名称而不是序号值进行强制转换?没错,要仅使用序号检索枚举,请使用
values()
。我用代码示例更新了我的答案。我似乎也不能明确地设置序数值,我尝试过:GM(“5”)、Toyota(“6”)不,你不能设置它们-序数将与枚举中声明的值的顺序匹配。如果出于某种原因,你需要与枚举的每个元素关联的不同的
int
编号(除了自动分配的序号之外),您始终可以将其与getter一起作为属性添加到枚举中