给定一个字符串,我希望在恒定时间内获得相当于它的枚举。 我有一个类似于问题所示的枚举。 Best way to create enum of strings?
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”?
答案 0 :(得分:3)
Enum.valueOf()
不够吗?你会怎么想象比这更有效率? (通常)不需要枚举STRING_ONE("ONE")
- 只需调用枚举值ONE
,即可免费查找.valueOf()
。
否则,只需创建一个private static Map<String, YourEnum>
并提供一个类似valueOf()
的方法来查看Map
。
答案 1 :(得分:1)
由于Enum.valueOf
对enum
的内置名称(即"STRING_ONE"
和"STRING_TWO"
)进行操作,您需要自行推送&#34;注册表&# 34; name-to-enum,像这样:
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private static final Map<String,Strings> byName = new HashMap<String,Strings>();
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
的映射进行翻译。如果名称不存在,则会从null
方法返回Strings.forName
。
答案 2 :(得分:0)
我认为您需要将代码更改为:
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
参考