Java предоставляет метод valueOf() для каждого объекта Enum<T>, поэтому заданный enum как
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
можно выполнить поиск, например
Day day = Day.valueOf("Monday");
Если строка, переданная в valueOf(), не соответствует (чувствительна к регистру) существующему значению Day, генерируется IllegalArgumentException.
Чтобы сделать совпадение без учета регистра, можно написать собственный метод внутри перечисления Day, например.
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
Существует ли какой-либо общий способ, не используя кеширование значений или любых других дополнительных объектов, написать статический метод lookup(), как указано выше, только один раз (т.е. не для каждого enum), учитывая, что values() метод неявно добавляется в класс Enum<E> во время компиляции?
Подпись такого "общего" lookup() метода будет аналогична методу Enum.valueOf(), то есть:
public static <T extends Enum<T>> T lookup(Class<T> enumType, String name);
и он будет точно реализовывать функциональность метода Day.lookup() для любого enum, без необходимости переписывать один и тот же метод для каждого enum.