您想要一个
Map<String, Code>,但是如何整齐地填充它呢?枚举不允许您在初始化枚举实例之前初始化静态字段,但是有一个巧妙的小技巧,称为“
按需初始化holder idiom”,它使使用此功能所需的静态初始化映射变得容易实现:
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 pre; private Code(String pre) { this.pre = pre; Holder.CODE_MAP.put(pre, this); } public String getCode() { return this.pre; } public Code convertFromString(String pre) { return CODE_MAP.get(pre); }}之所以可行,是因为类加载器 在 初始化枚举类 之前先 初始化内部静态类,因此已将映射分配为在枚举实例初始化期间准备加载。
没有循环。无需特殊代码即可加载地图(在构造函数中完成)。最少的代码。



