0
public enum Foo {
   one ("one"), two ("two")
}

如何通过它的值(比如Foo.getFoo("two"))找到一个枚举应该返回Foo.two

4

4 回答 4

3

每个enum都有一个valueOf(String)查找给定名称的实例的方法。

Foo.valueOf("one") == Foo.one

这是基于枚举值的名称。枚举没有值的概念——只有名称和序数。

于 2012-08-02T03:17:00.260 回答
1

你有一些选择...

知道枚举,想按名字查

如果您知道确切的枚举类型及其名称,正如其他人指出的那样,您可以直接使用它:

Foo myFoo = Foo.valueOf("one");

请记住,字符串必须与枚举名称完全匹配,包括大小写。枚举值通常都是大写的,所以如果你用 some 查找String s,这样做通常是个好主意Foo.valueOf(s.toUpperCase())

有枚举的Class,想按名字查找

如果您没有该类型,但您有一个表示枚举类型的类,则可以使用静态方法Enum.valueOf(Class<T>, String)获取枚举的名称:

Class<T> myEnumClass = whatever();
T myEnum = Enum.valueOf(myEnumClass, "one");

如上所述,字符串区分大小写。

想通过一些非名称属性查找

如果您想通过其他一些(可能是唯一的)值来查找枚举,一种方法是遍历枚举值。你可以从 获取它们Foo.values(),或者,如果你只有一个Class<T>,你可以使用实例方法Class.getEnumConstants()

T[] values = myEnumClass.getEnumConstants();
for (T value : values) ...

相同,但可能更快

如果您需要经常这样做,并且速度是一个问题,那么将这些预加载到地图中可能会很有用(但请参阅下面的警告):

Map<EnumVal, Foo> valuesToEnum = new HashMap<EnumVal, Foo>();
for (Foo foo : Foo.values()) {
    EnumVal val = foo.getValue();
    Foo oldFoo = valuesToEnum.put(val, foo);
    assert oldFoo == null : "multiple Foos have a value " + val;
        // ^^^ this means we can't meaningfully look up by EnumVals.
}
// now you can do something like
EnumVal lookupBy = whatever2();
Foo foo = valuesToEnum.get(lookupBy);
if (foo == null)
    throw new IllegalArgumentException("no Foo has the value " + lookupBy);

请注意,这需要计算EnumVal' 的哈希,如果它没有预先计算,然后进行几次查找。如果枚举中有很多值,则此查找可能是值得的。否则,在少数项目上的循环可能与正负一样快 - 无论哪种方式,它都可以忽略不计。

于 2012-08-02T06:30:04.473 回答
0

特别是在您的情况下,Foo.valueOf(String)会这样做。

于 2012-08-02T03:18:15.167 回答
0

valueOf(String)唯一适用于声明的names 的Enum. 如果你想enum通过一些自定义值来查找,最好的方法是提供一个 find 方法:

public static Foo fromValue(String value) {
    for (Foo foo : Foo.values()) {
        if (foo.value.equals(value)) {
            return foo;
        }
    }
}
于 2012-08-02T03:53:59.963 回答