Case-insensitive matching of a string to a Java enum
enums, generics, java
Solution
I found getting the special blend of generics a little tricky, but this works.
public static <T extends Enum<?>> T searchEnum(Class<T> 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"));
}
Problem
`Java` provides a `valueOf()` method for every `Enum<T>` 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<E>` 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 extends Enum<T>> T lookup(Class<T> 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`.