通过字符串值查找Java枚举
假设我有一个枚举
public enum Blah {
A, B, C, D
}
我想找到一个字符串的枚举值,例如"A"
,它将是Blah.A
怎么可能做到这一点?
Enum.valueOf()
是我需要的方法吗? 如果是这样,我将如何使用它?
是的, Blah.valueOf("A")
会给你Blah.A
请注意,名称必须完全匹配,包括case: Blah.valueOf("a")
和Blah.valueOf("A ")
都会抛出IllegalArgumentException
。
静态方法valueOf()
和values()
是在编译时创建的,并不出现在源代码中。 尽管如此,它们确实出现在Javadoc中; 例如, Dialog.ModalityType
显示两种方法。
如果文本与枚举值不相同,则为另一种解决方案:
public enum Blah {
A("text1"),
B("text2"),
C("text3"),
D("text4");
private String text;
Blah(String text) {
this.text = text;
}
public String getText() {
return this.text;
}
public static Blah fromString(String text) {
for (Blah b : Blah.values()) {
if (b.text.equalsIgnoreCase(text)) {
return b;
}
}
return null;
}
}
下面是我使用的一个漂亮的实用程序:
/**
* A common method for all enums since they can't have another base class
* @param <T> Enum type
* @param c enum type. All enums must be all caps.
* @param string case insensitive
* @return corresponding enum, or null
*/
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
if( c != null && string != null ) {
try {
return Enum.valueOf(c, string.trim().toUpperCase());
} catch(IllegalArgumentException ex) {
}
}
return null;
}
然后在我的枚举类中,我通常会保存一些输入:
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
如果您的枚举不是全部大写,只需更改Enum.valueOf
行。
太糟糕了,我不能使用T.class
作为Enum.valueOf
因为T
被删除。