如何重新实现枚举的值

时间:2011-10-05 13:55:11

标签: java enums

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

我正在尝试基本的

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

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

我想我可以拿出一个超级课程,但我不知道如何把它放在一起。有什么想法吗?

5 个答案:

答案 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){
       ...
     }
}