有效地将java字符串转换为其等效枚举
给定一个字符串,我想在固定时间内得到它的枚举等价物。 我定义了一个枚举,如问题中所示 如果我现在得到一个字符串(比如“TWO”),有没有办法看看它是否存在,如果它存在,那么有没有办法定义一个方法来返回枚举值(例如,如果我传递了“TWO”,我应该返回“Strings.string\u TWO”?还不够?你怎么想象会比这更有效?有(通常)无需使用枚举有效地将java字符串转换为其等效枚举,java,performance,enums,java-7,Java,Performance,Enums,Java 7,给定一个字符串,我想在固定时间内得到它的枚举等价物。 我定义了一个枚举,如问题中所示 如果我现在得到一个字符串(比如“TWO”),有没有办法看看它是否存在,如果它存在,那么有没有办法定义一个方法来返回枚举值(例如,如果我传递了“TWO”,我应该返回“Strings.string\u TWO”?还不够?你怎么想象会比这更有效?有(通常)无需使用枚举字符串\u ONE(“ONE”)-只需调用枚举值ONE,即可免费获得.valueOf()查找 否则,只需创建一个私有静态映射,并提供一个类似的value
字符串\u ONE(“ONE”)
-只需调用枚举值ONE
,即可免费获得.valueOf()
查找
否则,只需创建一个私有静态映射
,并提供一个类似的valueOf()
方法来查找映射
是不够的?您如何想象比这更有效?通常不需要枚举字符串
-只需调用enum valueONE
即可免费获得.valueOf()
查找
否则,只需创建一个
private static Map
,并提供一个类似的valueOf()
方法来查找Map
我认为您需要将代码更改为: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
reference我认为您需要将代码更改为: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
参考,因为enum。valueOf
对enum
的内置名称进行操作(即“STRING_ONE”
和“STRING_TWO”
),您需要将自己的“registry”名称滚动到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);
}
}
公共枚举字符串{
字符串1(“一”),
字符串二(“二”)
;
私有静态最终映射byName=newhashmap();
私有最终字符串文本;
私有字符串(最终字符串文本){
this.text=文本;
}
静止的{
对于(字符串s:Strings.values()){
byName.put(s.toString(),s);
}
}
@凌驾
公共字符串toString(){
返回文本;
}
forName的公共静态字符串(字符串名称){
返回byName.get(name);
}
}
上面,使用从字符串名称到
枚举字符串的映射来进行转换。如果名称不存在,则null
将从Strings.forName
方法返回。因为enum.valueOf
对enum
的内置名称进行操作(即“string\u ONE”
和“string\u TWO”
)您需要将自己的名称“注册表”滚动到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);
}
}
公共枚举字符串{
字符串1(“一”),
字符串二(“二”)
;
私有静态最终映射byName=newhashmap();
私有最终字符串文本;
私有字符串(最终字符串文本){
this.text=文本;
}
静止的{
对于(字符串s:Strings.values()){
byName.put(s.toString(),s);
}
}
@凌驾
公共字符串toString(){
返回文本;
}
forName的公共静态字符串(字符串名称){
返回byName.get(name);
}
}
上面,使用从字符串名称到枚举字符串的映射来进行转换。如果名称不存在,null
将从Strings.forName
方法返回。将它们命名为ONE
,TWO
,并使用Strings.valueOf(string)
一个选项?有字符串似乎是重复的。STRING*
将它们命名为一个,两个,并使用字符串。valueOf(STRING)
一个选项?有字符串似乎是重复的。STRING*
。