Java 必知必会 第 7 篇
(精挑 Stack Overflow在java中排名前100的问题
懂得这些问题的答案帮你解决80%开发问题 )
问题
假设定义了如下的enum(枚举):
publicenumBlah{
A,B,C,D
}
已知枚举对应的String值,希望得到对应的枚举值。例如,已知"A",希望得到对应的枚举——Blah.A,应该怎么做?
Enum.valueOf()是否能实现以上目的,如果是,那我如何使用?
答案
是的,Blah.valueOf("A") 将会得到 Blah.A
静态方法valueOf() 和 values() 不存在于源码中,而是在编译时创建,我们也可以在JavaDoc查看到它们,比如 Dialog.ModalityTyp 就中出现这两个方法。
其他答案
当文本和枚举值不同时,可以采用这种方式:
publicenumBlah{
A("text1"),
B("text2"),
C("text3"),
D("text4");
privateStringtext;
Blah(Stringtext){
this.text=text;
}
publicStringgetText(){
returnthis.text;
}
publicstaticBlahfromString(Stringtext){
for(Blahb:Blah.values()){
if(b.text.equalsIgnoreCase(text)){
returnb;
}
}
returnnull;
}
}
fromString方法中,throw new IllegalArgumentException("No constant with text " + text + " found") 会比直接返回null更优秀.
其他答案
我有一个挺赞的工具方法:
/**
* A common method for all enums since they can't have another base class
* @param Enum type
* @param c enum type. All enums must be all caps.
* @param string case insensitive
* @return corresponding enum, or null
*/
publicstatic>T getEnumFromString(Classc,Stringstring){
if(c!=null&&string!=null){
try{
returnEnum.valueOf(c,string.trim().toUpperCase());
}catch(IllegalArgumentExceptionex){
}
}
returnnull;
}
你可以这么使用:
publicstaticMyEnumfromString(Stringname){
returngetEnumFromString(MyEnum.class,name);
}
推荐阅读: