从String转换为具有大量值的Java枚举
假设我有一个包含100个值的枚举。为了简单起见,请采用以下示例:
public enum code{
CODE_1("string1"),
CODE_2("string2"),
CODE_3("string3"),
CODE_4("string4"),
...
}
我想创建一个公共方法,以将具有已知格式(例如“ string1”,“ string2” …)的字符串转换为适当的枚举值CODE_1,CODE_2
…通常是通过遍历所有值来完成的,如果找到匹配项,返回该枚举值。
但是,我担心规则循环遍历所有值。这可能是一个巨大的瓶颈吗?如果不是100个元素而是1000个呢?
作为我自己的练习,我尝试使用静态映射优化此查找,这可以确保在给定任何字符串的情况下O(1)查找时间。我喜欢这种额外的头,但仅在确实需要时才将其包括在我的代码中。您对使用迭代方法和映射方法有何想法和发现?
public enum Code{
...
//enum values
...
//The string-to-Code map
private static final Map<String,Code> CODE_MAP = populateMap();
private static Map<String,Code> populateMap()
{
Map<String,Code> map = new HashMap<String,Code>();
for(Code c : Code.values())
{
map.put(c.getCode(), c);
}
return map;
}
private String code;
private Code(String code)
{
this.code = code;
}
public String getCode()
{
return this.code;
}
public Code convertFromString(String code)
{
//assume that the given string is actually a key value in the map
return (Code) CODE_MAP.get(code);
}
}
回答:
您想要一个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 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);
}
}
之所以可行,是因为类加载器 在 初始化枚举类 之前先 初始化内部静态类,因此已将映射分配为在枚举实例初始化期间准备加载。
没有循环。无需特殊代码即可加载地图(在构造函数中完成)。最少的代码。
以上是 从String转换为具有大量值的Java枚举 的全部内容, 来源链接: utcz.com/qa/399312.html