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

有效地将java字符串转换为其等效枚举,java,performance,enums,java-7,Java,Performance,Enums,Java 7,给定一个字符串,我想在固定时间内得到它的枚举等价物。 我定义了一个枚举,如问题中所示 如果我现在得到一个字符串(比如“TWO”),有没有办法看看它是否存在,如果它存在,那么有没有办法定义一个方法来返回枚举值(例如,如果我传递了“TWO”,我应该返回“Strings.string\u TWO”?还不够?你怎么想象会比这更有效?有(通常)无需使用枚举字符串\u ONE(“ONE”)-只需调用枚举值ONE,即可免费获得.valueOf()查找 否则,只需创建一个私有静态映射,并提供一个类似的value

给定一个字符串,我想在固定时间内得到它的枚举等价物。 我定义了一个枚举,如问题中所示

如果我现在得到一个字符串(比如“TWO”),有没有办法看看它是否存在,如果它存在,那么有没有办法定义一个方法来返回枚举值(例如,如果我传递了“TWO”,我应该返回“Strings.string\u TWO”?

还不够?你怎么想象会比这更有效?有(通常)无需使用枚举
字符串\u ONE(“ONE”)
-只需调用枚举值
ONE
,即可免费获得
.valueOf()
查找

否则,只需创建一个
私有静态映射
,并提供一个类似的
valueOf()
方法来查找
映射
是不够的?您如何想象比这更有效?通常不需要枚举
字符串
-只需调用enum value
ONE
即可免费获得
.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*