Достать “Enum с параметром” по значению параметра в джаве

Частенько встречаются перечисления, дополнительно хранящие некие значения.

Чтобы в дальнейшем можно было, например, при сериализации в json это самое значение подставлять автоматом. Тогда возникает обычно и обратная задача – десериализовать (распарсить) значение обратно в Enum.

Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами 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()) )); } }

Разве что – в реальных условиях он выбрасывает не IllegalArgumentException, а кастомное исключение.

ValuedEnum – это интерфейс, который реализуют все Enum со значением. Вот он:

public sealed interface ValuedEnum<V> permits ComplexValue, NumberValue, StringValue { V getValue(); ValuedEnum<V> fromValue(V value); }

Сделан sealed, чтобы при имплементации (методом копипасты с опорой на "так сойдёт") – был дополнительный “маячок”, заставляющий обратить внимание – это именно Enum со значением.

Примеры реализаций и тесты вставлять смысла не вижу - там уже достаточно много, но не особо интересно. И проще, при желании, скопировать-запустить с сайта или найти в телеге.

Результаты тестов привожу:

Достать “Enum с параметром” по значению параметра в джаве
Начать дискуссию