我如何从它的字符串值查找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