Java provides a valueOf() method for every Enum object, so given an enum like
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
one can do a lookup like
Day day = Day.valueOf("Monday");
If the string passed to valueOf() does not match (case sensitive) an existing Day value, an IllegalArgumentException is thrown.
To do a case-insensitive matching, one can write a custom method inside the Day enum, e.g.
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
Is there any generic way, without using caching of values or any other extra objects, to write a static lookup() method like the above only once (i.e., not for every enum), given that the values() method is implicitly added to the Enum class at compile time?
The signature of such a "generic" lookup() method would be similar to the Enum.valueOf() method, i.e.:
public static > T lookup(Class enumType, String name);
and it would implement exactly the functionality of the Day.lookup() method for any enum, without the need to re-write the same method for each enum.
解决方案
I found getting the special blend of generics a little tricky, but this works.
public static > T searchEnum(Class enumeration,
String search) {
for (T each : enumeration.getEnumConstants()) {
if (each.name().compareToIgnoreCase(search) == 0) {
return each;
}
}
return null;
}
Example
public enum Horse {
THREE_LEG_JOE, GLUE_FACTORY
};
public static void main(String[] args) {
System.out.println(searchEnum(Horse.class, "Three_Leg_Joe"));
System.out.println(searchEnum(Day.class, "ThUrSdAy"));
}