如何从其字符串值中查找 Java 枚举?

2022-08-31 06:29:41

我想从其字符串值(或可能的任何其他值)中查找枚举。我已经尝试了以下代码,但它不允许在初始化器中使用静态。有没有简单的方法?

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);
    }
};

答案 1

使用为每个枚举自动创建的方法。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;
}

只有在探查器告诉您的情况下,稍后才能转到 Map 实现。

我知道它正在迭代所有值,但是只有3个枚举值,它几乎不值得任何其他努力,事实上,除非你有很多值,否则我不会打扰Map,它会足够快。


答案 2

你很接近。对于任意值,请尝试类似下面的操作:

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);
    }
}