Валидатор Generic String to Enum

Мне нужно проверить файл CSV с кучей столбцов. Некоторым из них необходимо сопоставить различные типы перечислений. Я знаю, как проверить строковое значение на соответствие определенному типу перечисления, но мне хотелось бы иметь общий метод проверки, в котором я мог бы передавать строковое значение и тип перечисления и получать результат проверки. Пока у меня есть это:

private boolean valitateSomeSpecificEnum(String value) {
    try {
        SomeSpecificEnum.valueOf(value);
        return true;
    } catch (IllegalArgumentException e) {
        return false;
    }
}

Возможно ли что-то вроде:

private boolean valitateAgainstTheEnum(String value, Enum<?> theEnum) {
    try {
        theEnum.valueOf(value);
        return true;
    } catch (IllegalArgumentException e) {
        return false;
    }
}

Обратите внимание: я использую Enum<?> в сигнатуре метода просто для того, чтобы было понятно, чего я хочу достичь. Я знаю, что в написанном виде это не сработает.

Тогда я мог бы назвать это так

valitateTheEnum("foo", SomeSpecificEnum.class);

это вообще возможно?

Что находится в SomeSpecificEnum?

aled 30.07.2024 14:33

Это какой-то конкретный класс перечисления, который у меня уже есть.

Ajant 30.07.2024 14:35

Смотрите это

g00se 30.07.2024 14:40

Вопросы @Ajant в Stack Overflow должны быть конкретными и включать минимальный воспроизводимый пример, поэтому вам следует включить такие классы в свой вопрос.

aled 30.07.2024 15:34

Ух ты, два голоса против и закрытый вопрос, потому что мне не удалось найти похожий и определенно не дублированный вопрос??? Тем, кто помог, большое спасибо за ваш вклад. Тем, кто проголосовал против и закрыл, что угодно.

Ajant 30.07.2024 16:17

Однако немного загадочно, почему вам нужно проверять, поскольку обычным результатом является простое сопоставление компонентов.

g00se 30.07.2024 16:40

Я обрабатываю файл csv вручную. Когда я читаю файл, я получаю кучу массивов строк. Мне нужно выполнить различные проверки (формат почты, непустота и т. д.) для различных столбцов и создать очень специфический формат ответа. Мне не известен какой-либо способ автоматического сопоставления таких данных, но я был бы рад изучить любые ваши предложения.

Ajant 30.07.2024 16:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Основываясь на ссылке, предоставленной g00se в комментарии, я придумал это, и это работает:

private boolean valitateAgainstTheEnum(String value, Class<? extends Enum> theEnum) {
    try {
        Enum.valueOf(theEnum, value);
        return true;
    } catch (IllegalArgumentException e) {
        return false;
    }
}

Остается только вопрос, есть ли более элегантный способ сделать это.

Вы пробовали использовать потоки?

Coding Enthusiast 30.07.2024 15:26

Не уверен, что понимаю вопрос

Ajant 30.07.2024 15:27

Вы можете попробовать Stream.anyMatch().

Нравиться:

private static <E extends Enum<E>> boolean validate(String value, Class<E> enumClass) {
    return Stream.of(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value));
}

ПРИМЕЧАНИЕ. Я изменил общую подпись, чтобы предотвратить предупреждение «необработанного типа».

Зачем вам транслировать что-то, если вы можете получить к нему прямой доступ без циклических конструкций?

g00se 30.07.2024 15:33

Этот вопрос отмечен как дублированный. Вы можете отправить свой ответ на исходный вопрос.

aled 30.07.2024 15:35

@ g00se Потому что OP нужен логический результат вместо члена перечисления, и Enum.valueOf не возвращает null, а выдает IllegalArgumentException, если значение не найдено.

Coding Enthusiast 30.07.2024 15:39

Извините, я этого даже отдаленно не понимаю.

g00se 30.07.2024 15:46

Другие вопросы по теме