Проверка наличия строки в enum Java: аналог ArrayList.contains()
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
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.
Разбор различных подходов
Существует множество методов, оптимальность которых зависит от конкретной ситуации. Вот перечень этих подходов:
Метод | Описание |
---|---|
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 кажется оптимальным:
if(EnumUtils.isValidEnum(MyEnum.class, myValue)) {
switch(MyEnum.valueOf(myValue)) {
// содержимое switch case
}
}
Таким образом, мы избегаем выброса исключения IllegalArgumentException
.
Обращение с Enum.valueOf()
Не хотите столкнуться с исключениями? Отказывайтесь от использования Enum.valueOf()
. Как говорит народная мудрость: "Без исключений — жизнь безопаснее."
Использование Guava для работы с Optional
Библиотека Guava позволяет обогатить код контейнером Optional
:
Optional<MyEnum> presentEnum = Enums.getIfPresent(MyEnum.class, myValue);
Optional
надежно указывает наличие или отсутствие искомой строки в значениях enum.
Ситуации с малым объемом перечисления и редкими проверками
Если в enum небольшое количество элементов или проверки осуществляются нечасто, нет нужды использовать такие мощные инструменты, как HashSet
или Streams
. Вполне хватит простого цикла.
Визуализация
Представим наше enum как сундук 🧰, содержащий свитки 📜 (то есть наши строки):
🧰: [📜"CONSTANT1", 📜"CONSTANT2", 📜"CONSTANT3"]
И проверим наличие свитка:
public boolean isScrollInChest(String scroll) {
for (MyEnum constant : MyEnum.values()) {
if (constant.name().equals(scroll)) {
return true; // 🎉 Бинго, свиток найден!
}
}
return false; // 😞 К сожалению, свиток не найден...
}
Примеры:
Ищем: 📜"CONSTANT2" Результат: 🎉
Ищем: 📜"NOT_HERE" Результат: 😞
Мы используем метод .name()
для преобразования элементов enum в строку.
Будьте осторожны
Во время написания кода нужно быть особенно внимательными к следующим моментам:
Динамическое изменение enum
Не забывайте, что после компиляции enum не предполагают изменений. Если же изменения необходимы, придется обновить связанные коллекции, такие как HashSet
или Stream
.
Чувствительность к регистру
Enum чувствительны к регистру. "CONSTANT1" и "constant1" рассматриваются как разные элементы.
Сложности с сериализацией
Сериализация может вызвать дополнительные трудности при работе с enum и коллекциями, например, HashSet
. Уделяйте особое внимание этому аспекту в своем коде.
Полезные материалы
- Enum Types (The Java™ Tutorials) — Введение в enum от Oracle.
- Chapter 8. Classes — Подробная информация о enum в официальной спецификации Java от Oracle.
- How to get an enum value from a string value in Java – Stack Overflow — Обсуждение преобразования строк в enum на Stack Overflow.
- EnumSet (Java Platform SE 8) — Всё, что нужно знать о EnumSet в официальной документации Java.
- EnumUtils (Apache Commons Lang 3.14.0 API) — Подробный разбор EnumUtils из Apache Commons Lang.
- DZone — Статья с примерами и методами работы с enum на DZone.