从String转换为具有大量值的Java枚举
这个问题在这里已经有了答案:
你想要一个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
。
上一篇: Convert from String to a Java enum with large amount of values