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

标签 java generics enums

假设我有两个实现 Foo 接口(interface)的枚举类

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

关于java - 从 String 创建枚举实例的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22436944/

相关文章:

java - 如何在 Mac 上使用 Jenkins 运行 selenium 测试用例?

javascript - Javascript 中具有泛型的高阶类?

c# - 枚举值 '' 对于类型 > 'EnumType' 无效,无法序列化

java - 从仅在运行时已知的枚举中获取值

java - 如何使用 ftp4j 通过 sftp 连接到 linux

Java/马文 : different slf4j versions in different projects causing build errors on integration

java - android string array nullpointerexception 在旧的 android 版本上

c# - 在 Roslyn 程序集中获取匿名类型的通用参数类型

java - 创建具有相同类元素的通用元组

python - 如何检查 Python 枚举中项目的排序?