Just iterate over all your enum types (you can place them in some collection) and invoke
Enum.valueOf(EnumType, nameOfConstant)
But be careful because this method will throw java.lang.IllegalArgumentException
if checked enum type will not have described field.
Other way would be just iterating over collection of your enum types, getting its values (you can use Class.getEnumConstants
here) and checking if name of enum constant is same as name passed by user.
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;
}
I used Collection> instead of Collection<Class<Enum<?>>>
because generics are not covariant so Collection<Class<Enum<?>>>
would not let you add Class<YourEnum>>
to itself.
Usage example
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());
}
Output: THURSDAY from class SO22436944$DaysIDontLike