从String创建枚举实例的通用方法



假设我有两个实现Foo接口的enum类

public enum Enum1 implements Foo {
  ENUM1_CONST1,
  ENUM1_CONST2;
}
public enum Enum2 implements Foo {
  ENUM2_CONST1,
  ENUM2_CONST2;
}

如何创建一个方法的类型安全实现,该方法接受字符串作为参数,该字符串匹配任何枚举常量的名称,并返回一个Foo实例,该实例可以是两个枚举定义中的任何常量。

也就是说: Foo foo1 = holyGrailMethod("ENUM1_CONST1"); Foo foo2 = holyGrailMethod("ENUM1_CONST2"); Foo foo3 = holyGrailMethod("ENUM2_CONST1"); Foo foo4 = holyGrailMethod("ENUM2_CONST2");

只需遍历所有枚举类型(您可以将它们放在某个集合中)并调用

Enum.valueOf(EnumType, nameOfConstant) 

但是要小心,因为如果被检查的枚举类型没有描述字段,这个方法将抛出java.lang.IllegalArgumentException


另一种方法是迭代枚举类型的集合,获得它的值(您可以在这里使用Class.getEnumConstants)并检查枚举常量的名称是否与用户传递的名称相同。

public static Enum<?> getEnumFromMany(Collection<Class<?>> enums, String value) {
    for (Class<?> enumType : (Collection<Class<?>>) enums)
        if (enumType.isEnum()) {
            @SuppressWarnings("unchecked")
            Class<Enum<?>> clazz = (Class<Enum<?>>) enumType;
            for (Enum<?> en : clazz.getEnumConstants()) {
                if (en.name().equals(value))
                    return en;
            }
        }
    return null;
}

我用Collection>代替Collection<Class<Enum<?>>>,因为泛型不是协变的,所以Collection<Class<Enum<?>>>不会让你把Class<YourEnum>>添加到它自己。

用法示例

public enum DaysILike {
    FRIDAY, SATURDAY, SUNDAY
}
public enum DaysIDontLike {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY
}
public static void main(String[] args) {
    List<Class<?>> enums = new ArrayList<>();
    enums.add(DaysIDontLike.class);
    enums.add(DaysILike.class);
    String yourString = "THURSDAY";
    Enum<?> en = getEnumFromMany(enums, yourString);
    System.out.println(en + " from " + en.getClass());
}

输出:THURSDAY from class SO22436944$DaysIDontLike

相关内容

  • 没有找到相关文章

最新更新