我需要重新实现一些枚举的enum.valueof方法,这样它们就不再抛出异常了,如果枚举中不存在值,它们只返回null。
我正在尝试基本的
@Override
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name){
但它不起作用,说我需要覆盖或实现超类型。
我想我可以拿出一个超级课程,但我不知道如何把它放在一起。有什么想法吗?
答案 0 :(得分:18)
你做不到。你必须定义另一种不同的方法。 valueOf方法由编译器自动生成。
public static MyEnum permissiveValueOf(String name) {
for (MyEnum e : values()) {
if (e.name().equals(name)) {
return e;
}
}
return null;
}
答案 1 :(得分:9)
使用Apache Commons Lang:
MyEnum myEnum = EnumUtils.getEnum(MyEnum.class, "MY_ENUM_VALUE");
来自Javadoc for EnumUtils.getEnum:
的引用获取类的枚举,如果未找到则返回null。
此方法与Enum.valueOf(java.lang.Class, java.lang.String)因为它不会抛出异常 枚举名称无效。
答案 2 :(得分:2)
是否绝对有必要将该方法称为valueOf
,就像枚举自动生成的方法一样?在我正在进行的项目中,我们有类似的方法,但我们称之为不同;例如,forName
:
public static ESomeEnum forName(String name) {
for (ESomeEnum e : ESomeEnum.values()) {
if (e.name().equals(name)) {
return e;
}
}
return null;
}
答案 3 :(得分:2)
您不必覆盖valueOf。这就是我的所作所为:
我必须&#34;解析&#34;枚举的一些字符串,并且它们与声明名称不匹配,因此我对valueOf(String name)
进行了一种重新实现。
public enum Command {
DIR("DIR"),
PUT("PUT"),
GET("GET"),
OK("OK"),
ERROR("ERROR"),
READY("READY"),
FIN("#FIN#");
private String name;
private Command(final String name) {
this.name = name;
}
/**
* Returns the desired Enum or throws an exception
* @param commandName - String with the name contained by the Enum that you want
* @return Command
*/
public static Command getEnum(String commandName){
// if the string is "#FIN#" returns Command.FIN.
if(FIN.toString().equals(commandName)){
return FIN;
}
// if the name matches any of the remaining enums return whichever one matches
else if(Arrays.asList(Command.values()).contains(Command.valueOf(commandName))){
return Command.valueOf(commandName);
}
// if it still wasn't found, throw an exception
throw new IllegalArgumentException("No enum defined for this string: " + commandName);
}
@Override
public String toString(){
return name;
}
}
此代码经过测试并有效。
您可以使用:
Command k = Command.getEnum("#FIN#");
System.out.println(k.name() + " " +k.toString());
k = Command.getEnum("PUT");
System.out.println(k.name() + " " +k.toString());
它的输出将是:
FIN #FIN#
PUT PUT
希望它有所帮助。
答案 4 :(得分:0)
您可以考虑在枚举类中创建一个新的(不同的名称,如convert)静态方法。
public enum MyEnum{
....
public static MyEnum convert(Object value){
...
}
}