Создайте статический метод, который извлекает подходящее для вас значение перечисления:
//inside Days, skips some excess array creation
private static final Days[] VALUES = Days.values();
public static Days getDay(String day) {
return Arrays.stream(VALUES)
.filter(d -> d.value.equalsIgnoreCase(day))
.findAny(); //Optional<Days>
//can use #orElse/#orElseThrow to decide behavior for a mismatch
}
Тогда нужно просто получить перечисление напрямую:
Days monday = Days.getDay("MON");
Вы можете сделать несколько методовкоторый фильтрует эти входы, если хотите.Даже если вы действительно хотите сойти с ума, вы можете пропустить Predicate<Days>
(или любое другое перечисление) и отфильтровать таким образом:
public static Days getDay(Predicate<Days> filter) {
return Arrays.stream(VALUES)
.filter(filter)
//In this case I'm returning null for no match
.findAny().orElse(null);
}
Затем:
Days monday = Days.getDay(d -> d.getValue().equalsIgnoreCase("MON"));
Теперь вв строгом случае Monday
, вы можете использовать Days#valueOf
, но это приведет к ошибке, если для искомой строки нет константы перечисления.
Days monday = Days.valueOf("Monday"); //okay
//all of these below would throw an error
monday = Days.valueOf("monday");
monday = Days.valueOf("MONDAY");
monday = Days.valueOf("not even close to monday");
Я бы также придерживался соглашений для перечисленийздесь (все заглавные буквы и подчеркивания для пробелов, так что MONDAY
).
Наконец, если это не просто примерная проблема, и вы фактически работаете с переменными дня / календаря и т. д., у вас есть *Перечисления 1022 * и Month
уже доступны в jdk по умолчанию.