public enum Foo {
one ("one"), two ("two")
}
如何通过它的值(比如Foo.getFoo("two")
)找到一个枚举应该返回Foo.two
。
public enum Foo {
one ("one"), two ("two")
}
如何通过它的值(比如Foo.getFoo("two")
)找到一个枚举应该返回Foo.two
。
每个enum
都有一个valueOf(String)
查找给定名称的实例的方法。
Foo.valueOf("one") == Foo.one
这是基于枚举值的名称。枚举没有值的概念——只有名称和序数。
你有一些选择...
如果您知道确切的枚举类型及其名称,正如其他人指出的那样,您可以直接使用它:
Foo myFoo = Foo.valueOf("one");
请记住,字符串必须与枚举名称完全匹配,包括大小写。枚举值通常都是大写的,所以如果你用 some 查找String s
,这样做通常是个好主意Foo.valueOf(s.toUpperCase())
。
如果您没有该类型,但您有一个表示枚举类型的类,则可以使用静态方法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
' 的哈希,如果它没有预先计算,然后进行几次查找。如果枚举中有很多值,则此查找可能是值得的。否则,在少数项目上的循环可能与正负一样快 - 无论哪种方式,它都可以忽略不计。
特别是在您的情况下,Foo.valueOf(String)
会这样做。
valueOf(String)
唯一适用于声明的name
s 的Enum
. 如果你想enum
通过一些自定义值来查找,最好的方法是提供一个 find 方法:
public static Foo fromValue(String value) {
for (Foo foo : Foo.values()) {
if (foo.value.equals(value)) {
return foo;
}
}
}