将 String 转换为等效的 Enum 值

我是否可以使用 Java 将 String转换为 Enumeration中的等效值。

我当然可以用一个大的 if-else语句来做这件事,但是如果可能的话,我想避免这样做。

Given this documentation:

Http://download.oracle.com/javase/1.4.2/docs/api/java/util/enumeration.html

如果没有“如果”或案例陈述,我不太相信这是可能的。

164022 次浏览

假设您使用 Java5枚举(由于您提到了旧的 Enumeration类,所以不太确定) ,您可以使用 java.lang.Enum子类的 valueOf方法:

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");

希望你能意识到,java.util.Enumeration不同于 Java 1.5的 Enum类型。

您可以简单地使用 YourEnum.valueOf("String")来获得等效的枚举类型。

Thus if your enum is defined as so:

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}

你可以这样做:

String day = "SUNDAY";


Day dayEnum = Day.valueOf(day);

使用为每个 enum定义的静态方法 valueOf(String)

例如,如果你有 enum MyEnum,你可以说 MyEnum.valueOf("foo")

我可能在没有意识到 Type.valueOf("enum string")确实存在的情况下过度设计了自己的解决方案。

我想它给了更多的粒度控制,但我不确定这是否真的有必要。

public enum Type {
DEBIT,
CREDIT;


public static Map<String, Type> typeMapping = Maps.newHashMap();
static {
typeMapping.put(DEBIT.name(), DEBIT);
typeMapping.put(CREDIT.name(), CREDIT);
}


public static Type getType(String typeName) {
if (typeMapping.get(typeName) == null) {
throw new RuntimeException(String.format("There is no Type mapping with name (%s)"));
}
return typeMapping.get(typeName);
}
}

I guess you're exchanging IllegalArgumentException for RuntimeException (or whatever exception you wish to throw) which could potentially clean up code.

关于使用 valueOf (string)的其他响应是正确的,但是我要补充的是,您应该保护您的代码,以防传递无效字符串的可能性。虽然今天您的代码可能只传递与有效枚举值对应的字符串,但是将来对枚举的更改或对代码其他部分(或由其他人编写的代码)的更改有可能打破这种假设。

这对于诸如为类的枚举成员变量编写 setter 之类的情况非常重要。你的阶级和它的引导者应该保护他们自己。

JavaDocs for Enum显示可以对此引发异常(IllegalArgumentExceptionNullPointerException)。您应该通用地或具体地处理这些问题。JavaDocs 还显示这个函数不喜欢“无关的空格”... ... 所以考虑使用 trim ()。

我可能会通常这样处理异常:

Enum BestEnumEver {OPTION_A, OPTION_B, OPTION_C}


// ... elsewhere in your code ...
// How confident are you that stringVar will have an acceptable value?
// How confident are you that the existing enum options will not need to change?
BestEnumEver enumValue;
try {
// Consider using trim to eliminate extraneous whitespace
enumValue = BestEnumEver.valueOf(stringVar.trim());
} catch (Exception e) {
// handle the situation here. Here are a couple of ideas.
// Apply null and expect the using code to detect.
enumValue = null;
// Have a defined private constant for a default value
// assuming a default value would make more sense than null
enumValue = DEFAULT_BEST_ENUM_EVER;
}

But you could also handle each exceptions in some unique way.

Enum BestEnumEver {OPTION_A, OPTION_B, OPTION_C}


// ... elsewhere in your code ...
// How confident are you that stringVar will have an acceptable value?
// How confident are you that the existing enum options will not need to change?
BestEnumEver enumValue;
try {
// Consider using trim to eliminate extraneous whitespace
enumValue = BestEnumEver.valueOf(stringVar.trim());
} catch (IllegalArgumentException e1) {
// handle the situation here ...
} catch (NullPointerException e2) {
// handle the situation here ...
}