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