从String转换为具有大量值的Java枚举

这个问题在这里已经有了答案:

  • 通过字符串值查找Java枚举23个答案

  • 你想要一个Map<String, Code> ,但是如何整齐地填充它? 枚举不允许你在枚举实例初始化之前初始化一个静态字段,但是有一个巧妙的小技巧,称为初始化按需持有者习惯用法,这使得使用这个功能所需的静态初始化映射易于实现:

    public enum Code {
        CODE_1("string1"),
        CODE_2("string2"),
        CODE_3("string3"),
        // etc
        ;
    
        private static class Holder {
            static Map<String, Code> CODE_MAP = new HashMap<>();
        }
    
        private final String code;
    
        private Code(String code) {
            this.code = code;
            Holder.CODE_MAP.put(code, this);
        }
    
        public String getCode() {
            return this.code;
        }
    
        public Code convertFromString(String code) {
            return CODE_MAP.get(code);
        }
    }
    

    这是可行的,因为类加载器在初始化枚举类之前初始化内部静态类,因此映射在枚举实例初始化期间已准备好加载。

    没有循环。 没有特殊的代码来加载地图(在构造函数中完成)。 最小的代码。


    地图是不错的选择:更清洁的代码和O(1) 。 如果你使用for-loop那么你得到的最好是O(n)


    您提供的解决方案是正确实施。

    因为你将不得不公开一种方法,而且它更具可读性。

    使用Map而不是iterating it manually总是很好的。

    正如你所提到的,复杂性是O(1)

    +1 to your question ,因为它提供a cleaner approach to use enum in some usecases

    链接地址: http://www.djcxy.com/p/38081.html

    上一篇: Convert from String to a Java enum with large amount of values

    下一篇: Static Initialization Before Enum Elements