6

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

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

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

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

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

Получить класс Enum по значению

Импорты копировать не буду, полагаю, IDE предложит их подставить по выбору, если автоматически не сможет этого сделать. Сам утилитный метод примитивен:

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

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

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

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

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

Всяческого разумного порицания жду нетерпеливо, неразумного - со смирением :)

Лига программистов

2.1K постов11.9K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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

1
Автор поста оценил этот комментарий

Java я не знаю, я пишу на C++ и Rust, но пара моментов меня смущает.


"class<T> enumType" - Зачем передавать что-то кроме "V value", при том что тип возвращаемого значения является параметром шаблона и известен?


filter() -> findAny() - В джаве точно нет API для действия "найти первый попавшийся элемент, подходящий под предикат, или упасть"? Опять же, не уверен что filter() ленивый, и если нет, то для больших энумов вы будете формировать тыщу строковых значений на лету только чтобы обнаружить, что например 2й элемент из этого списка подходит.


Именование: "Valued" - я не знаю других переводов этого слова, кроме "ценимый", что точно не отражает задачу интерфейса. Я бы использовал например ConvertibleBetween, ConvertibleFromTo.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Обобщённый пропадает в рантайме. Как иначе получить список значений для обхода - тоже не знаю. За этот вопрос спасибо, любопытно подумать над ним.


Это оно и есть. В одно действие - не вижу такого в 17 версии. Ленивый, тут всё нормально.


В общем-то - взял название из тех же Commons, в расчете, что носители лучше меня ориентируются в предметной области (https://commons.apache.org/proper/commons-lang/javadocs/api-...) - оно всех устроило.

0
Автор поста оценил этот комментарий
Правильно понимаю что все нормально работает только при условии уникальности хранимых значений?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, так.