代码之家  ›  专栏  ›  技术社区  ›  RBz

Java枚举值(字符串)和枚举类

  •  1
  • RBz  · 技术社区  · 7 年前

    我有如下列举:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Mạnh Quyết Nguyễn    7 年前

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

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

    你原来的方法是随机的 Class enumClass 类类型,接受任何类。当将输入类视为枚举时,它将引发运行时异常

        2
  •  2
  •   Michael    7 年前

    EnumUtils 从Apache Commons已经有一个方法可以做到这一点: 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")
    

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