无论如何通过将枚举与给定字符串进行比较来检查枚举是否存在?我似乎找不到任何这样的功能。我可以尝试使用 valueOf
方法并捕获异常,但有人告诉我捕获运行时异常不是好的做法。有人有什么想法吗?
原文由 Danny 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我需要这样做,我有时会构建一个 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"));
}
}
原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
我不认为有一种内置的方法可以在不捕获异常的情况下做到这一点。你可以改用这样的东西:
编辑: 正如 Jon Skeet 所指出的,
values()
通过在每次调用时克隆一个私有后备阵列来工作。如果性能至关重要,您可能只想调用values()
一次,缓存数组,然后遍历它。此外,如果您的枚举具有大量值,则 Jon Skeet 的 map 替代方案可能比任何数组迭代执行得更好。