Найти в Дзене
3 подписчика

Получение класса “Enum с параметром” по значению параметра


Частенько в коде встречаются перечисления, дополнительно хранящие некие значения (в виде private final поля обычно).
Чтобы в дальнейшем можно было, например, при сериализации в json это значение подставлять автоматом (@JsonValue у Jackson). Тогда возникает обычно и обратная задача – десериализовать (распарсить) значение обратно в Enum (@JsonCreator у Jackson).

Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами Enum. Решил сделать один раз утилитный метод и в проекте им пользоваться. Благо, время позволило.

В принципе, подобный метод есть в недрах Apache Commons EnumUtils, но он работает только со строковым параметром String enumName, плюс выкидывает стандартное исключение. А обычно надо выкинуть некое кастомное, принятое на проекте. Так и родился свой костылёчек, как оно зачастую и бывает.
Получить класс Enum по значению

Импорты копировать не буду, полагаю, IDE предложит их подставить по выбору, если автоматически не сможет этого сделать. Сам утилитный метод примитивен:
public final class EnumUtil {
private EnumUtil() {}
public static <T extends ValuedEnum<V>, V> T fromValue(Class<T> enumType, V value) {
return Arrays.stream(enumType.getEnumConstants())
.filter(it -> it.getValue().equals(value))
.findAny()
.orElseThrow(() -> new IllegalArgumentException(String.format(
"Wrong value [%s] for enum type [%s]", value, enumType.getSimpleName())
));
}
}

ValuedEnum – это интерфейс, который реализуют все Enum со значением. Вот он:
public sealed interface ValuedEnum<V> permits
ComplexValue,
NumberValue,
StringValue
{
V getValue();
ValuedEnum<V> fromValue(V value);
}
Сделан sealed, чтобы при имплементации (методом копипасты) – был дополнительный “маячок”, заставляющий обратить внимание – это именно Enum со значением.

Пример работы и тесты - на сайте, в запись ТГ не влезают.

#java #программинг #Памятки
Получение класса “Enum с параметром” по значению параметра  Частенько в коде встречаются перечисления, дополнительно хранящие некие значения (в виде private final поля обычно).
1 минута