Проверка наличия строки в enum Java: аналог ArrayList.contains()

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
public enum MyEnum {
    // значения перечисления
}

public static boolean isEnumContains(String str) {
    // Простая проверка за одну строку кода
    return Arrays.stream(MyEnum.values()).anyMatch(e -> e.name().equals(str)); 
}

Мы пользуемся методами Arrays.stream() и anyMatch() для краткой и эффектной проверки наличия строки в перечислении enum MyEnum.

Кинга Идем в IT: пошаговый план для смены профессии

Разбор различных подходов

Существует множество методов, оптимальность которых зависит от конкретной ситуации. Вот перечень этих подходов:

МетодОписание
Apache Commons LangПредлагает удобный метод: EnumUtils.isValidEnum(MyEnum.class, myValue)
Использование HashSetОсобенно эффективен для больших enum, с производительностью O(1)
Использование Stream APIРеализует преимущества функционального программирования: Stream.of(MyEnum.values()).anyMatch(e -> e.name().equals(myValue))

Навигация по различным сценариям

В разработке возможны различные случаи.

Применение switch case

Если требуется использовать switch для строкового значения, метод из библиотеки Apache Commons Lang кажется оптимальным:

Java
Скопировать код
if(EnumUtils.isValidEnum(MyEnum.class, myValue)) {
    switch(MyEnum.valueOf(myValue)) {
        // содержимое switch case
    }
}

Таким образом, мы избегаем выброса исключения IllegalArgumentException.

Обращение с Enum.valueOf()

Не хотите столкнуться с исключениями? Отказывайтесь от использования Enum.valueOf(). Как говорит народная мудрость: "Без исключений — жизнь безопаснее."

Использование Guava для работы с Optional

Библиотека Guava позволяет обогатить код контейнером Optional:

Java
Скопировать код
Optional<MyEnum> presentEnum = Enums.getIfPresent(MyEnum.class, myValue);

Optional надежно указывает наличие или отсутствие искомой строки в значениях enum.

Ситуации с малым объемом перечисления и редкими проверками

Если в enum небольшое количество элементов или проверки осуществляются нечасто, нет нужды использовать такие мощные инструменты, как HashSet или Streams. Вполне хватит простого цикла.

Визуализация

Представим наше enum как сундук 🧰, содержащий свитки 📜 (то есть наши строки):

Markdown
Скопировать код
🧰: [📜"CONSTANT1", 📜"CONSTANT2", 📜"CONSTANT3"]

И проверим наличие свитка:

Java
Скопировать код
public boolean isScrollInChest(String scroll) {
    for (MyEnum constant : MyEnum.values()) {
        if (constant.name().equals(scroll)) {
            return true; // 🎉 Бинго, свиток найден!
        }
    }
    return false; // 😞 К сожалению, свиток не найден...
}

Примеры:

Markdown
Скопировать код
Ищем: 📜"CONSTANT2"   Результат: 🎉
Ищем: 📜"NOT_HERE" Результат: 😞

Мы используем метод .name() для преобразования элементов enum в строку.

Будьте осторожны

Во время написания кода нужно быть особенно внимательными к следующим моментам:

Динамическое изменение enum

Не забывайте, что после компиляции enum не предполагают изменений. Если же изменения необходимы, придется обновить связанные коллекции, такие как HashSet или Stream.

Чувствительность к регистру

Enum чувствительны к регистру. "CONSTANT1" и "constant1" рассматриваются как разные элементы.

Сложности с сериализацией

Сериализация может вызвать дополнительные трудности при работе с enum и коллекциями, например, HashSet. Уделяйте особое внимание этому аспекту в своем коде.

Полезные материалы

  1. Enum Types (The Java™ Tutorials) — Введение в enum от Oracle.
  2. Chapter 8. Classes — Подробная информация о enum в официальной спецификации Java от Oracle.
  3. How to get an enum value from a string value in Java – Stack Overflow — Обсуждение преобразования строк в enum на Stack Overflow.
  4. EnumSet (Java Platform SE 8) — Всё, что нужно знать о EnumSet в официальной документации Java.
  5. EnumUtils (Apache Commons Lang 3.14.0 API) — Подробный разбор EnumUtils из Apache Commons Lang.
  6. DZone — Статья с примерами и методами работы с enum на DZone.