Достать “Enum с параметром” по значению параметра в джаве
Частенько встречаются перечисления, дополнительно хранящие некие значения.
Чтобы в дальнейшем можно было, например, при сериализации в json это самое значение подставлять автоматом. Тогда возникает обычно и обратная задача – десериализовать (распарсить) значение обратно в Enum.
Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами Enum. Их прям очень много таких оказалось на нынешнем проекте. Решил сделать один раз утилитный метод и в проекте им пользоваться. Благо, время позволило.
В принципе, подобный метод есть в недрах Apache Commons EnumUtils, но он работает только со строковым параметром String enumName, плюс выкидывает стандартное исключение. А обычно надо выкинуть некое кастомное, принятое на проекте. Так и родился свой костылёчек, как оно зачастую и бывает.
Получить класс Enum по значению
Импорты копировать не буду, полагаю, IDE предложит их подставить по выбору, если автоматически не сможет этого сделать. Сам утилитный метод примитивен:
Разве что – в реальных условиях он выбрасывает не IllegalArgumentException, а кастомное исключение.
ValuedEnum – это интерфейс, который реализуют все Enum со значением. Вот он:
Сделан sealed, чтобы при имплементации (методом копипасты с опорой на "так сойдёт") – был дополнительный “маячок”, заставляющий обратить внимание – это именно Enum со значением.
Примеры реализаций и тесты картинками вставлять смысла не вижу - там уже достаточно много и проще скопировать-запустить с сайта или найти в говнотелеге.
Результаты тестов привожу:
Всяческого разумного порицания жду нетерпеливо, неразумного - со смирением :)



Java я не знаю, я пишу на C++ и Rust, но пара моментов меня смущает.
"class<T> enumType" - Зачем передавать что-то кроме "V value", при том что тип возвращаемого значения является параметром шаблона и известен?
filter() -> findAny() - В джаве точно нет API для действия "найти первый попавшийся элемент, подходящий под предикат, или упасть"? Опять же, не уверен что filter() ленивый, и если нет, то для больших энумов вы будете формировать тыщу строковых значений на лету только чтобы обнаружить, что например 2й элемент из этого списка подходит.
Именование: "Valued" - я не знаю других переводов этого слова, кроме "ценимый", что точно не отражает задачу интерфейса. Я бы использовал например ConvertibleBetween, ConvertibleFromTo.