检查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

    上一篇: Check if enum exists in Java

    下一篇: Generate data for MySQL tables