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
.