从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

回到顶部