如何重新实现枚举的值

我需要重新实现我的一些枚举的enum.valueof方法,这样它们就不再抛出exception,而是如果枚举中不存在值,它们只返回null。

我正在尝试基本的

@Override public static <T extends Enum> T valueOf(Class enumType, String name){ 

但它不起作用,说我需要覆盖或实现超类型。

我想我可以拿出一个超级class,但我不知道怎么把它放在一起。 有任何想法吗?

你不能。 你必须定义另一种不同的方法。 valueOf方法由编译器自动生成。

 public static MyEnum permissiveValueOf(String name) { for (MyEnum e : values()) { if (e.name().equals(name)) { return e; } } return null; } 

使用Apache Commons Lang:

 MyEnum myEnum = EnumUtils.getEnum(MyEnum.class, "MY_ENUM_VALUE"); 

引用来自Javadoc的EnumUtils.getEnum :

获取类的枚举,如果未找到则返回null。

此方法与Enum.valueOf(java.lang.Class,java.lang.String)的不同之处在于它不会为无效的枚举名称抛出exception。

是否绝对有必要将该方法称为valueOf就像枚举自动生成的方法一样? 在我正在进行的项目中,我们有类似的方法,但我们称之为不同; 例如, forName

 public static ESomeEnum forName(String name) { for (ESomeEnum e : ESomeEnum.values()) { if (e.name().equals(name)) { return e; } } return null; } 

您不必覆盖valueOf。 这是我做的:

我不得不“解析”一些字符串到枚举,并且它们与它们的声明名称不匹配,所以我做了一种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 

希望能帮助到你。

您可以考虑在枚举类中创建一个新的(不同的名称,如convert)静态方法。

 public enum MyEnum{ .... public static MyEnum convert(Object value){ ... } }