Как правильно перебрать все значения enum в Java с помощью цикла for?
Использование метода values() для перебора enum
В Java у каждого перечисления (enum) автоматически присутствует статический метод values(), который возвращает массив всех констант в том порядке, в котором они объявлены. Именно этот метод и нужно использовать для итерации.
Вот правильный способ перебрать все значения вашего enum Day:
for (Day day : Day.values()) {
System.out.println(day);
}
Этот код выведет:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
Почему это работает?
Day.values()возвращает массив типаDay[], содержащий все константы.- Конструкция
for-each(enhanced for loop) отлично подходит для перебора массивов и коллекций. - Порядок элементов в массиве соответствует порядку объявления констант в enum.
Альтернативные варианты
Если вам по какой-то причине нужен обычный цикл for с индексом, можно сделать так:
Day[] days = Day.values();
for (int i = 0; i < days.length; i++) {
System.out.println(days[i]);
}
Или, если вы работаете с Java 8+, можно использовать Stream API:
Arrays.stream(Day.values())
.forEach(System.out::println);
Важные замечания
- Метод
values()создаёт новый массив при каждом вызове. Это редко становится проблемой, но имейте в виду, если вызываете его в горячем цикле тысячи раз. - Не пытайтесь использовать
Day.lengthилиDay[i]— это не сработает, так как сам enum не является массивом. - Если вам нужно получить количество констант, используйте
Day.values().length.
Полный рабочий пример
public class EnumExample {
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static void main(String[] args) {
System.out.println("Все дни недели:");
for (Day day : Day.values()) {
System.out.println(day + " (порядковый номер: " + day.ordinal() + ")");
}
}
}
Этот код выведет не только названия, но и их порядковые номера (начиная с 0), что может быть полезно для отладки.
Надеюсь, теперь всё стало ясно! Метод values() — это стандартный и самый простой способ перебора enum в Java.
Использование EnumSet для перебора
Ещё один подход, который может быть полезен в некоторых сценариях — использование EnumSet. Это специализированная коллекция для enum, которая работает очень эффективно.
import java.util.EnumSet;
for (Day day : EnumSet.allOf(Day.class)) {
System.out.println(day);
}
EnumSet.allOf(Day.class) возвращает множество, содержащее все константы enum. Преимущество этого подхода:
- Работает быстрее, чем
values(), если вы используете его многократно (EnumSet кэшируется внутри). - Позволяет легко фильтровать диапазоны:
EnumSet.range(Day.MONDAY, Day.FRIDAY)— только будни. - Можно комбинировать с другими операциями над множествами.
Однако для простого перебора всех значений values() остаётся самым лаконичным и читаемым вариантом. Используйте EnumSet, если вам нужны дополнительные возможности фильтрации или работа с подмножествами.