检查Java中是否存在枚举
无论如何,通过将枚举与给定的字符串进行比较来检查枚举是否存在? 我似乎无法找到任何这样的功能。 我可以尝试使用valueOf
方法并捕获一个异常,但我被告知捕获运行时异常并不是好的做法。 任何人有任何想法?
我不认为有一种内置的方法可以在不捕捉异常的情况下执行此操作。 你可以改用这样的东西:
public static MyEnum asMyEnum(String str) {
for (MyEnum me : MyEnum.values()) {
if (me.name().equalsIgnoreCase(str))
return me;
}
return null;
}
编辑:正如Jon Skeet指出的, values()
每次调用时都会克隆一个私有的后备数组。 如果性能非常关键,那么您可能只需调用一次values()
,缓存该数组,然后遍历该数组。
另外,如果你的枚举值有很多值,那么Jon Skeet的map替代方法可能比任何数组迭代都要好。
如果我需要这样做,我有时会建立一个Set<String>
的名字,甚至是我自己的Map<String,MyEnum>
- 然后你可以检查它。
值得注意的几点:
values()
- 它必须每次创建并填充一个新数组。 要遍历所有元素,请使用EnumSet.allOf
,这对于没有大量元素的枚举更有效。 示例代码:
import java.util.*;
enum SampleEnum {
Foo,
Bar;
private static final Map<String, SampleEnum> nameToValueMap =
new HashMap<String, SampleEnum>();
static {
for (SampleEnum value : EnumSet.allOf(SampleEnum.class)) {
nameToValueMap.put(value.name(), value);
}
}
public static SampleEnum forName(String name) {
return nameToValueMap.get(name);
}
}
public class Test {
public static void main(String [] args)
throws Exception { // Just for simplicity!
System.out.println(SampleEnum.forName("Foo"));
System.out.println(SampleEnum.forName("Bar"));
System.out.println(SampleEnum.forName("Baz"));
}
}
当然,如果你只有几个名字,这可能是过度的 - 当n足够小时,O(n)解决方案常常胜过O(1)解决方案。 这是另一种方法:
import java.util.*;
enum SampleEnum {
Foo,
Bar;
// We know we'll never mutate this, so we can keep
// a local copy.
private static final SampleEnum[] copyOfValues = values();
public static SampleEnum forName(String name) {
for (SampleEnum value : copyOfValues) {
if (value.name().equals(name)) {
return value;
}
}
return null;
}
}
public class Test {
public static void main(String [] args)
throws Exception { // Just for simplicity!
System.out.println(SampleEnum.forName("Foo"));
System.out.println(SampleEnum.forName("Bar"));
System.out.println(SampleEnum.forName("Baz"));
}
}
我最喜欢的lib之一:Apache Commons。
EnumUtils可以轻松完成。
以下是验证Enum的示例代码:
MyEnum strTypeEnum = null;
// test if String str is compatible with the enum
if( EnumUtils.isValidEnum(MyEnum.class, str) ){
strTypeEnum = MyEnum.valueOf(str);
}
链接地址: http://www.djcxy.com/p/6487.html