繁体   English   中英

Java enum.valueOf(String)和enum.class

[英]Java enum.valueOf(String) and enum.class

我有几个如下的枚举:

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()但在这里不起作用。 有没有办法做到这一点?

您可能要像这样修改函数:

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

您的原始方法采用了随机的Class enumClass类类型,该类型可以接受任何类。 将输入类视为枚举时,它将抛出运行时异常

来自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")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM