Java enum.valueOf(String)和enum.class

时间:2018-05-22 09:48:27

标签: java class object types enums

我的内容很少,如下所示:

public enum Season {
    SPRING, SUMMER, AUTUM, WINTER
}

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

我正在尝试编写一个关注的常用方法。

private void doSomethingWithAnyEnum(Class enumClass,String checkThisProperty) 
{
  if(EnumUtils.isValidEnum(enumClass, checkThisProperty))
  {
    //here i should be able to call valueOf(String) method on enum
    //without bothering about the type coming in. 
  }
}

因此我可以将此方法称为:

doSomethingWithAnyEnum(Days.class,"blah") ;
doSomethingWithAnyEnum(Seasons.class,"blah");

我被困在如何传递枚举并使用相同的方法在方法中使用它的类和名称。我尝试使用simpleName(),但它不能在这里完成任务。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

您可能需要像这样修改您的功能:

public <T extends Enum<T>> void doSomethingWithAnyEnum(Class<T> tClass, String name) {
    T t  = Enum.valueOf(tClass, name);
}

您的原始方法采用随机Class enumClass类类型,它接受任何类。将输入类视为枚举

时,它将抛出运行时异常

答案 1 :(得分:2)

来自Apache Commons的

EnumUtils已经有了这样做的方法:getEnum。正如您已经在isValidEnum中使用它一样,将它用于此也是有道理的。

您的方法签名还应该使用泛型而不是原始类型来在编译时强制执行doSomethingWithAnyEnum使用枚举而不是任何旧类调用。我已经为你解决了这个问题。

private <E extends Enum<E>> void doSomethingWithAnyEnum(Class<E> enumClass,
                                                        String checkThisProperty)
{
    if (EnumUtils.isValidEnum(enumClass, checkThisProperty))
    {
        final E value = EnumUtils.getEnum(enumClass, checkThisProperty);
        System.out.println(value.name()); //or whatever else you want to do
    }
}

如果没有对方法签名进行此更改,我可以使用

调用此方法
doSomethingWithAnyEnum(String.class, "hello")

它只会在运行时失败。最好在编译时进行检查。