有效地将java字符串转换为其等效的枚举

给定一个字符串我想在恒定时间内获得它的枚举。 我有一个定义类似于问题所示的枚举。 创建字符串枚举的最佳方法?

public enum Strings { STRING_ONE("ONE"), STRING_TWO("TWO") ; private final String text; /** * @param text */ private Strings(final String text) { this.text = text; } /* (non-Javadoc) * @see java.lang.Enum#toString() */ @Override public String toString() { return text; } } 

如果我现在得到一个字符串(说“TWO”),有没有办法看看它是否存在,如果它存在,那么有一种方法可以定义一个将返回枚举值的方法(例如,如果我通过“TWO” “,我应该回来”Strings.STRING_TWO“?

Enum.valueOf()还不够吗? 你会怎么想象比这更有效率? (通常)不需要枚举STRING_ONE("ONE") – 只需调用枚举值ONE ,你就可以免费获得.valueOf()查询。

否则,只需创建一个private static Map并提供一个类似于private static Map valueOf()的类似valueOf()方法。

由于Enum.valueOfenum的内置名称(即"STRING_ONE""STRING_TWO" )进行操作,因此您需要滚动自己的“注册表”名称到枚举,如下所示:

 public enum Strings { STRING_ONE("ONE"), STRING_TWO("TWO") ; private static final Map byName = new HashMap(); private final String text; private Strings(final String text) { this.text = text; } static { for (Strings s : Strings.values()) { byName.put(s.toString(), s); } } @Override public String toString() { return text; } public static Strings forName(String name) { return byName.get(name); } } 

演示。

上面是一个从字符串名称到enum Strings的映射用于进行翻译。 如果名称不存在,则从Strings.forName方法返回null

我认为您需要将代码更改为:

 public enum Strings { STRING_ONE("ONE"), STRING_TWO("TWO"); private String text; /** * @param text */ private Strings(final String text) { this.text = text; } public String getText() { return this.text; } public static Strings getByTextValue(String text) { for (Strings str : Strings.values()) { if (str.getText().equals(text)) { return str; } } return null; } /* * (non-Javadoc) * * @see java.lang.Enum#toString() */ @Override public String toString() { return text; } } 

示例:

 String test = "ONE"; Strings testEnum = Strings.getByTextValue(test); 

现在你有testEnum这是enum引用