Java enum вывести все значения

Перебор значений Enum в Java

В Java Enum — это тип данных, который помогает нам присвоить предопределенный набор констант переменной.

В этом кратком руководстве мы изучим различные способы перебора Enum в Java.

2. Перебор значений Enum

Давайте сначала определим Enum , чтобы мы могли создать несколько простых примеров кода:

 public enum DaysOfWeekEnum    SUNDAY,   MONDAY,   TUESDAY,   WEDNESDAY,   THURSDAY,   FRIDAY,   SATURDAY   > 

У перечислений нет методов для итерации, таких как forEach() или iterator() . Вместо этого мы можем использовать массив значений Enum , возвращаемый методом values() .

2.1. Итерация с использованием цикла for

Во-первых, мы можем просто использовать старый цикл for :

 for (DaysOfWeekEnum day : DaysOfWeekEnum.values())    System.out.println(day);   > 

2.2. Итерация с использованием потока

Мы также можем использовать java.util.Stream для выполнения операций со значениями Enum .

Чтобы создать поток, у нас есть два варианта. Первый использует Stream.of :

 Stream.of(DaysOfWeekEnum.values()); 

Второй использует Arrays.stream :

 Arrays.stream(DaysOfWeekEnum.values()); 

Давайте расширим класс DaysOfWeekEnum , чтобы создать пример с использованием Stream :

 public enum DaysOfWeekEnum     SUNDAY("off"),   MONDAY("working"),   TUESDAY("working"),   WEDNESDAY("working"),   THURSDAY("working"),   FRIDAY("working"),   SATURDAY("off");    private String typeOfDay;    DaysOfWeekEnum(String typeOfDay)    this.typeOfDay = typeOfDay;   >    // standard getters and setters    public static StreamDaysOfWeekEnum> stream()    return Stream.of(DaysOfWeekEnum.values());   >   > 

Теперь напишем пример для вывода нерабочих дней:

 public class EnumStreamExample     public static void main()    DaysOfWeekEnum.stream()   .filter(d -> d.getTypeOfDay().equals("off"))   .forEach(System.out::println);   >   > 

Вывод, который мы получаем, когда мы запускаем это:

2.3. Итерация с использованием forEach()

Метод forEach() был добавлен в интерфейс Iterable в Java 8. Таким образом, все классы коллекций Java имеют реализации метода forEach() . Чтобы использовать их с Enum , нам сначала нужно преобразовать Enum в подходящую коллекцию. Мы можем использовать Arrays.asList() для создания ArrayList, который мы затем можем зациклить, используя метод forEach() :

 Arrays.asList(DaysOfWeekEnum.values())   .forEach(day -> System.out.println(day)); 

2.4. Итерация с использованием EnumSet

EnumSet — это специализированная реализация набора, которую мы можем использовать с типами Enum :

 EnumSet.allOf(DaysOfWeekEnum.class)   .forEach(day -> System.out.println(day)); 

2.5. Использование ArrayList значений Enum _

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

 ListDaysOfWeekEnum> days = new ArrayList>();  days.add(DaysOfWeekEnum.FRIDAY);  days.add(DaysOfWeekEnum.SATURDAY);  days.add(DaysOfWeekEnum.SUNDAY);   for (DaysOfWeekEnum day : days)    System.out.println(day);   >  days.remove(DaysOfWeekEnum.SATURDAY);   if (!days.contains(DaysOfWeekEnum.SATURDAY))    System.out.println("Saturday is no longer in the list");   >   for (DaysOfWeekEnum day : days)    System.out.println(day);   > 

Мы также можем создать ArrayList , используя Arrays.asList() .

Однако, поскольку ArrayList поддерживается массивом значений Enum , он будет неизменяем, поэтому мы не можем добавлять или удалять элементы из списка. Удаление в следующем коде завершится ошибкой UnsupportedOperationException :

 ListDaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());  days.remove(0); 

3. Заключение

В этой статье мы обсудили различные способы перебора Enum с использованием forEach, Stream и цикла for в Java.

Если нам нужно выполнить какие-то параллельные операции, Stream — хороший вариант. В противном случае ограничений на использование метода нет.

Как всегда, код для всех описанных здесь примеров можно найти на GitHub .

Источник

Java enum вывести все значения

* Информация для продвинутых юзеров. На самом деле возможно ограниченное наследование от Enum. Подробнее здесь: https://kibungo.livejournal.com/19999.html Пример наследования и переопределения общего метода:

 public enum MyEnum < VAL1 < public int returnMyVal()< return 20; >>, VAL2; public int returnMyVal() < return 10; >> ------------------------ System.out.println(MyEnum.VAL1.returnMyVal()) // 20 System.out.println(MyEnum.VAL2.returnMyVal()) // 10 

«По сравнению с обычными классами, на Enum наложили одно серьезное ограничение — от него невозможно наследоваться.» Что за бред вы пишете?! Все перечисления изначально неявно расширяют класс java.lang.Enum, а поскольку в Java нету множественного наследования, то и расширять enum уже больше ничего не может.

В статье enum в коде с маленькой буквы, в комментариях к коду — Enum с большой Почему не говорится, что это разные вещи? Если у нас несколько enum`ов с перечислениями в приложении и нам нужно передать один из них как аргумент в метод можно сделать просто так someMethod(Enum e) < и здесь написать условие для выбора одного из enum`ов >Т.е. не нужно приводить все enum`ы к единому интерфейсу или абстрактному классу, чтобы выбрать один из enum`ов Как я понял Enum(тот который с большой буквы) — это что-то типа пустого интерфейса для всех enum`ов

 @Override public String toString() < return "DayOfWeek'; 

В коде приведенного примера про школьника есть ошибка: задано поле private ScholarSchedule schedule, но сеттер для него не прописан, а так как оно изначально не инициализировано, получаете NullPointerException. Добавьте сеттер (либо просто сделайте это поле public, что есть костыль) для задания значения:

 public void setSchedule(ScholarSchedule schedule)

Ну или, в конце концов, поместите метод main в класс Scholar (видимо так и задумывалось автором примера изначально), тогда он будет иметь доступ к private ScholarSchedule schedule и сможет инициализировать его надлежащим образом.

Источник

Java Enum перечисления с примерами

Enums – это специальный тип, используемый для определения коллекций констант. Точнее, тип перечисления – это особый вид класса Java, который может содержать константы, методы и т. д. Были добавлены в Java 5. Это руководство объясняет, как создавать и использовать их.

Пример Enum

Обратите внимание на ключевое слово enum, которое используется вместо класса или интерфейса. Оно сообщает компилятору, что это определение типа является перечислением.

Вы можете сослаться на константы в перечислении выше, как это:

Обратите внимание, что переменная уровня имеет тип Level, который является типом перечисления, определенным в примере выше. Переменная уровня может принимать одну из констант уровня Level в качестве значения (HIGH, MEDIUM или LOW). В этом случае уровень установлен на HIGH.

В заявлениях if

Поскольку перечисления являются константами, вам часто приходится сравнивать переменную, указывающую на константу перечисления, с возможными константами в типе перечисления:

Level level = . //assign some Level constant to it if( level == Level.HIGH) < >else if( level == Level.MEDIUM) < >else if( level == Level.LOW)

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

Если одно из значений встречается чаще, чем другие, проверка этого значения в первом операторе if приведет к лучшей производительности, так как выполняется меньше сравнений в среднем. Это не большая разница, если только сравнения не выполняются.

В выражениях

Если ваши типы перечислений содержат много констант, и вам нужно проверить переменную по значениям, как показано в предыдущем разделе, использование оператора переключения switch может быть хорошей идеей:

Level level = . //assign some Level constant to it switch(level)

Замените … на код, который нужно выполнить, если переменная уровня соответствует заданному значению константы уровня. Код может быть простой операцией, вызовом метода и т. д.

Итерации

Вы можете получить массив всех возможных значений типа enum, вызвав его метод static values(). Все типы перечислений получают статический метод values() автоматически компилятором. Вот пример итерации всех значений:

for(Level level : Level.values())

Выполнение этого кода распечатало бы все значения:

Обратите внимание, как распечатываются имена самих констант. Это одна из областей, где перечисления отличаются от статических конечных констант.

toString()

Класс enum автоматически получает метод toString() в классе при компиляции. Он возвращает строковое значение имени данного экземпляра перечисления:

String levelText = Level.HIGH.toString();

Значением переменной levelText после выполнения вышеприведенного оператора будет текст HIGH.

Printing

Если вы печатаете перечисление, вот так:

System.out.println(Level.HIGH);

Затем метод toString() будет вызван и значение, которое будет напечатано, является текстовым именем экземпляра enum. Другими словами, в приведенном выше примере текст HIGH был бы напечатан.

valueOf()

Класс enum автоматически получает статический метод valueOf() в классе при компиляции. Его можно использовать для получения экземпляра класса для данного значения String:

Level level = Level.valueOf("HIGH");

Переменная уровня будет указывать на Level.HIGH после выполнения этой строки.

Fields

Вы можете добавить поля в перечисление. Таким образом, каждое значение константы enum получает их. Значения полей должны быть предоставлены конструктору перечисления при определении констант:

Обратите внимание, что перечисление в приведенном выше примере имеет конструктор, который принимает int. Он устанавливает поле int. Когда постоянные значения перечисления определены, значение int передается в конструктор Java.

Конструктор enum должен быть либо закрытым, либо областью действия пакета (по умолчанию). Вы не можете использовать публичные или защищенные.

Методы

Вы также можете добавлять методы:

public enum Level < HIGH(3), //calls constructor with value 3 MEDIUM(2), //calls constructor with value 2 LOW (1) //calls constructor with value 1 ; // semicolon needed when fields / methods follow private final int levelCode; Level(int levelCode) < this.levelCode = levelCode; >public int getLevelCode() < return this.levelCode; >>

Вы вызываете метод через ссылку на одно из значений констант:

Level level = Level.HIGH; System.out.println(level.getLevelCode());

Этот код выведет значение 3, которое является значением поля levelCode для константы перечисления HIGH.

Вы не ограничены простыми методами получения и установки. Можете создавать методы, которые производят вычисления на основе значений полей константы перечисления. Если поля не объявлены как final, вправе изменить значения полей (хотя это может быть не очень хорошей идеей, учитывая, что перечисления должны быть константами).

Abstract методы

Для класса enum также могут быть абстрактные методы. Если у класса есть абстрактный метод, то каждый экземпляр класса должен его реализовывать:

public enum Level < HIGH< @Override public String asLowerCase() < return HIGH.toString().toLowerCase(); >>, MEDIUM < @Override public String asLowerCase() < return MEDIUM.toString().toLowerCase(); >>, LOW < @Override public String asLowerCase() < return LOW.toString().toLowerCase(); >>; public abstract String asLowerCase(); >

Обратите внимание на объявление абстрактного метода внизу класса enum. Каждый экземпляр enum (каждая константа) определяет собственную реализацию этого метода. Его использование полезно, когда нужна отдельная реализация метода для каждого экземпляра перечисления.

Реализация интерфейса

Enum может реализовать интерфейс, если чувствуете, что это имеет смысл в вашей ситуации:

public enum EnumImplementingInterface implements MyInterface < FIRST("First Value"), SECOND("Second Value"); private String description = null; private EnumImplementingInterface(String desc)< this.description = desc; >@Override public String getDescription() < return this.description; >>

Это метод getDescription(), который приходит из интерфейса MyInterface.

Реализация интерфейса с Enum может использоваться для реализации набора различных констант Comparator, которые применяются для сортировки коллекций объектов.

EnumSet

Специальная реализация Java Set под названием EnumSet, которая может хранить перечисления более эффективно, чем стандартные реализации:

EnumSet enumSet = EnumSet.of(Level.HIGH, Level.MEDIUM);

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

EnumMap

Специальная реализация Java Map, которая может использовать экземпляры перечисления в качестве ключей:

EnumMap enumMap = new EnumMap(Level.class); enumMap.put(Level.HIGH , "High level"); enumMap.put(Level.MEDIUM, "Medium level"); enumMap.put(Level.LOW , "Low level"); String levelValue = enumMap.get(Level.HIGH);

Детали

  • Перечисления неявно расширяют класс java.lang.Enum, поэтому типы перечислений не могут расширять другой класс.
  • Если перечисление содержит поля и методы, определение полей и методов должно всегда идти в списке констант в нем. Кроме того, список констант должен заканчиваться точкой с запятой (;).

Источник

Читайте также:  Python http server lib
Оцените статью