【问题标题】:Java enum.valueOf(String) and enum.classJava enum.valueOf(String) 和 enum.class
【发布时间】:2018-11-01 01:00:46
【问题描述】:

我有几个像下面这样的枚举:

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

【问题讨论】:

  • "...并在方法中使用它的类和名称,使用相同的东西" 你这是什么意思?你能举个例子说明你正在尝试做什么吗?
  • 我不知道您所说的“用 [...] 做某事但以更通用的方式”是什么意思。
  • @f1sh 为清楚起见编辑了注释部分。如果清楚,请告诉我。

标签: java class object types enums


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可能想像这样修改你的函数:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多