假设我有两个实现 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/