Как преобразовать строку в enum и перебрать значения
Короткий ответ
valueOf() находит константу по имени, name() возвращает имя обратно:
enum Status { NEW, PAID, SHIPPED }
void main() {
Status status = Status.valueOf("PAID");
IO.println(status);
IO.println(status.name().toLowerCase());
}Результат:
PAID
paidВсе значения
values() возвращает массив всех констант в порядке объявления, ordinal() — номер константы:
enum Status { NEW, PAID, SHIPPED }
void main() {
for (Status s : Status.values()) {
IO.println(s.ordinal() + " " + s);
}
}Результат:
0 NEW
1 PAID
2 SHIPPEDБезопасное преобразование
Для пользовательского ввода приведите строку к верхнему регистру и обработайте неизвестное значение:
enum Status { NEW, PAID, SHIPPED }
Optional<Status> parse(String text) {
try {
return Optional.of(Status.valueOf(text.strip().toUpperCase(Locale.ROOT)));
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
void main() {
IO.println(parse(" paid "));
IO.println(parse("lost"));
}Результат:
Optional[PAID]
Optional.emptyСвоё поле
Константы могут хранить данные — например, подпись для интерфейса:
enum Size {
S("Small"), M("Medium"), L("Large");
private final String label;
Size(String label) {
this.label = label;
}
static Size fromLabel(String label) {
return Arrays.stream(values()).filter(s -> s.label.equals(label)).findFirst().orElseThrow();
}
}
void main() {
IO.println(Size.fromLabel("Medium"));
}Результат:
MЧастая ошибка
valueOf() учитывает регистр и выбрасывает исключение для неизвестного имени:
enum Status { NEW, PAID, SHIPPED }
void main() {
Status.valueOf("paid");
}Результат:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant Main.Status.paidФункции из этого ответа
- enum — Объявляет перечисление — тип с фиксированным набором значений.