我如何从它的字符串值查找Java枚举?
我想从它的字符串值(或可能的任何其他值)查找枚举。 我试过下面的代码,但它不允许在初始化程序中使用静态代码。 有一个简单的方法吗?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
使用为每个Enum自动创建的valueOf
方法。
Verbosity.valueOf("BRIEF") == Verbosity.BRIEF
对于任意值,开始于:
public static Verbosity findByAbbr(String abbr){
for(Verbosity v : values()){
if( v.abbr().equals(abbr)){
return v;
}
}
return null;
}
如果您的分析器告诉您,则稍后再继续执行映射实施。
我知道它遍历所有的值,但只有3枚枚举值是不值得任何其他努力,事实上,除非你有很多值,我不会打扰一个Map它会足够快。
你很近。 对于任意值,请尝试如下所示:
public enum Day {
MONDAY("M"), TUESDAY("T"), WEDNESDAY("W"),
THURSDAY("R"), FRIDAY("F"), SATURDAY("Sa"), SUNDAY("Su"), ;
private final String abbreviation;
// Reverse-lookup map for getting a day from an abbreviation
private static final Map<String, Day> lookup = new HashMap<String, Day>();
static {
for (Day d : Day.values()) {
lookup.put(d.getAbbreviation(), d);
}
}
private Day(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
public static Day get(String abbreviation) {
return lookup.get(abbreviation);
}
}
@莱尔的回答是相当危险的,我看到它不起作用,特别是如果你让枚举成为一个静态的内部类。 相反,我使用了这样的东西,它将在枚举之前加载BootstrapSingleton映射。
使用现代JVM(JVM 1.6或更高版本) 编辑这个应该不成问题,但我认为JRebel仍然存在问题,但我没有机会重新测试它。
先装我吧:
public final class BootstrapSingleton {
// Reverse-lookup map for getting a day from an abbreviation
public static final Map<String, Day> lookup = new HashMap<String, Day>();
}
现在将其加载到枚举构造函数中:
public enum Day {
MONDAY("M"), TUESDAY("T"), WEDNESDAY("W"),
THURSDAY("R"), FRIDAY("F"), SATURDAY("Sa"), SUNDAY("Su"), ;
private final String abbreviation;
private Day(String abbreviation) {
this.abbreviation = abbreviation;
BootstrapSingleton.lookup.put(abbreviation, this);
}
public String getAbbreviation() {
return abbreviation;
}
public static Day get(String abbreviation) {
return lookup.get(abbreviation);
}
}
如果你有一个内部枚举,你可以在枚举定义上面定义Map,并且(理论上)应该在之前加载。
链接地址: http://www.djcxy.com/p/6493.html上一篇: How can I lookup a Java enum from its String value?
下一篇: Execution order of of static blocks in an Enum type w.r.t to constructor