从String创建枚举实例的一般方法

时间:2014-03-16 12:39:47

标签: java generics enums

假设我有两个实现Foo接口

的枚举类
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");

1 个答案:

答案 0 :(得分:3)

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

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&gt;而不是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