检查枚举是否存在于 Java 中

新手上路,请多包涵

无论如何通过将枚举与给定字符串进行比较来检查枚举是否存在?我似乎找不到任何这样的功能。我可以尝试使用 valueOf 方法并捕获异常,但有人告诉我捕获运行时异常不是好的做法。有人有什么想法吗?

原文由 Danny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

我不认为有一种内置的方法可以在不捕获异常的情况下做到这一点。你可以改用这样的东西:

 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 替代方案可能比任何数组迭代执行得更好。

原文由 Michael Myers 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果我需要这样做,我有时会构建一个 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题