- Что такое перечисления в Java? (java enum)
- 1. Объявление перечисления в Java вне класса
- 2. Объявление перечисления в Java внутри класса
- Перечисление с использованием оператора Switch
- Values() и метод ValueOf()
- Перечисление с помощью конструктора, переменной экземпляра и метода
- Что нужно знать?
- Java 8 перечисления
Что такое перечисления в Java? (java enum)
Перечисление или java enum – это набор именованных констант, который помогает в определении своих собственных типов данных. Когда вы можете определить тип переменных в программе, становится легко их определить.
Перечисление – это в основном список именованных констант. В Java это определяет тип класса. Он может иметь конструкторы, методы и переменные экземпляра. Он создается с помощью ключевого слова enum. По умолчанию каждая константа перечисления имеет вид.
Хотя перечисление определяет тип класса и имеет конструкторы, вам не нужно создавать экземпляр перечисления с помощью новой переменной. Переменные перечисления используются и объявляются так же, как переменные примитива.
Объявление enum может быть сделано вне Класса или внутри Класса. Но мы не можем объявить Enum внутри метода. Давайте рассмотрим небольшой пример, чтобы понять его декларацию.
1. Объявление перечисления в Java вне класса
enum Directions < // enum keyword is used instead of class keyword NORTH, SOUTH, EAST, WEST; >public class enumDeclaration < public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>
2. Объявление перечисления в Java внутри класса
public class enumDeclaration < enum Directions< NORTH, SOUTH, EAST, WEST; >public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>
Первая строка внутри типа enum должна быть списком констант. Затем вы можете использовать методы, переменные и конструктор. По сути, enum представляет группу переменных и констант.
- Enum в Java в основном улучшает безопасность типов.
- Его можно по-разному использовать в примерах переключения.
- Enum может быть легко пройден.
- Перечисление имеет поля, конструкторы и методы.
- Enum в основном реализует много интерфейсов, но не может расширять какой-либо класс, потому что он внутренне расширяет класс Enum.
Перечисление с использованием оператора Switch
Значение перечисления также может использоваться для управления оператором switch. Необходимо, чтобы все операторы case использовали константы из того же перечисления, что и оператор switch. Ниже пример демонстрирует то же самое.
package Edureka; import java.util.*; enum Directions < NORTH, SOUTH, EAST, WEST >public class Test1< public static void main(String[] args) < Directions d= Directions.SOUTH; switch(d) < //The name of the enumertion constants are used without their enumeration case NORTH: //only constants defined under enum Directions can be used System.out.println("North direction"); break; case SOUTH: System.out.println("South direction"); break; case EAST: System.out.println("East directiion"); break; case WEST: System.out.println("West directiion"); break; >
Values() и метод ValueOf()
Values(): при создании enum компилятор Java внутренне добавляет метод values(). Этот метод возвращает массив, содержащий все значения перечисления.
public static enum-type[ ] values()
ValueOf(): этот метод используется для возврата константы перечисления, значение которой равно строке, переданной в качестве аргумента при вызове этого метода.
public static enum-type valueOf (String str)
Теперь давайте напишем программу, чтобы понять эти методы более подробно.
All constants of enum type Colors are: black red blue pink white I Like red
Вот как вы можете использовать метод Values(), чтобы вернуть массив, содержащий все перечисления, присутствующие в методе, и Valueof(), чтобы вернуть константу перечисления.
Перечисление с помощью конструктора, переменной экземпляра и метода
По сути, перечисление может содержать конструктор и выполняется отдельно для каждой константы перечисления во время загрузки класса перечисления. Кроме того, перечисление может создавать конкретные методы.
enum Student < mack(11), Birdie(10), Son(13), Victor(9); private int age; //variable defined in enum Student int getage < return age; >//method defined in enum Student public Student(int age) //constructor defined in enum < this.age= age; >> class EnumDemo < public static void main( String args[] ) < Student S; System.out.println("Age of Victor is " +Student.Victor.getage()+ "years"); >>
Здесь, как только мы объявляем переменную enum(), конструктор вызывается один раз, и он инициализирует параметр age для каждой константы перечисления значениями, указанными в скобках.
Что нужно знать?
1). Перечисления в Java являются типобезопасными и имеют собственное пространство имен. Это означает, что ваше перечисление будет иметь тип, например «Валюта» в приведенном ниже примере, и вы не можете присвоить какое-либо значение, кроме указанного в константах перечисления.
public enum Currency < PENNY, NICKLE, DIME, QUARTER >; Currency coin = Currency.PENNY; coin = 1; //compilation error
2). Enum в Java – это ссылочные типы, такие как класс или интерфейс, и вы можете определить конструктор, методы и переменные внутри, что делает его более мощным, чем Enum в C и C ++, как показано в следующем примере.
3). Вы можете указать значения констант перечисления во время создания, как показано в примере ниже:
Но для этого вам необходимо определить переменную-член и конструктор, потому что PENNY (1) фактически вызывает конструктор, который принимает значение int, см. Пример ниже.
Конструктор должен быть закрытым, любой другой модификатор доступа приведет к ошибке компиляции. Теперь, чтобы получить значение, связанное с каждой монетой, вы можете определить общедоступный метод getValue() внутри перечисления Java, как любой обычный класс. Кроме того, точка с запятой в первой строке не обязательна.
4) Константы перечисления неявно статичны и окончательны и не могут быть изменены после создания. Например, приведенный ниже код приведет к ошибке компиляции:
Currency.PENNY = Currency.DIME;
Последнее поле EnumExamples.Currency.PENNY нельзя переназначить.
5) Может использоваться в качестве аргумента в операторе switch и с «case:», например, с примитивным типом int или char. Эта особенность делает их очень полезными для операций переключения. Давайте посмотрим, как использовать enum внутри оператора switch:
Currency usCoin = Currency.DIME; switch (usCoin)
Поскольку константы, определенные внутри Enum, являются окончательными, вы можете безопасно сравнивать их, используя «==», оператор равенства, как показано в следующем примере:
Currency usCoin = Currency.DIME; if(usCoin == Currency.DIME)< System.out.println("enum in java can be compared using = EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="eclipse">for(Currency coin: Currency.values()) < System.out.println("coin: " + coin); >And it will print: coin: PENNY coin: NICKLE coin: DIME coin: QUARTER
8). Он также может переопределять методы. Давайте посмотрим на пример переопределения метода toString() внутри Enum, чтобы предоставить содержательное описание для констант перечислений.
public enum Currency < . @Override public String toString() < switch (this) < case PENNY: System.out.println("Penny: " + value); break; case NICKLE: System.out.println("Nickle: " + value); break; case DIME: System.out.println("Dime: " + value); break; case QUARTER: System.out.println("Quarter: " + value); >return super.toString(); > >;
А вот как это выглядит при отображении:
Currency usCoin = Currency.DIME; System.out.println(usCoin); Output: Dime: 10
9). Два новых класса коллекции EnumMap и EnumSet добавлены в пакет коллекции для поддержки. Эти классы представляют собой высокопроизводительную реализацию интерфейса Map and Set в Java, и мы должны использовать их всякий раз, когда есть возможность.
EnumSet не имеет общедоступного конструктора, вместо этого он предоставляет фабричные методы для создания экземпляра, например. EnumSet.of() методы. Этот дизайн позволяет EnumSet внутренне выбирать между двумя различными реализациями в зависимости от размера констант.
Если Enum имеет менее 64 констант, чем EnumSet использует класс RegularEnumSet, который внутренне использует длинную переменную для хранения этих 64 констант, а если Enum имеет больше ключей, чем 64, то он использует JumboEnumSet.
10). Вы не можете создать экземпляр перечислений с помощью оператора new в Java, потому что конструктор может быть только частным, а константы Enums могут быть созданы только внутри него самого.
11). Экземпляр создается, когда какие-либо константы Enum сначала вызываются или упоминаются в коде.
12). Может реализовать интерфейс и переопределить любой метод, такой как обычный класс. Также стоит отметить, что Enum в Java неявно реализует как Serializable, так и Comparable интерфейс. Давайте посмотрим и пример того, как реализовать интерфейс:
public enum Currency implements Runnable < PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; . @Override public void run() < System.out.println("Enum in Java implement interfaces"); >>
13). Вы можете определить абстрактные методы внутри Enum, а также можете предоставить другую реализацию для разных экземпляров. Давайте посмотрим на пример использования абстрактного метода внутри.
public enum Currency < PENNY(1) < @Override public String color() < return "copper"; >>, NICKLE(5) < @Override public String color() < return "bronze"; >>, DIME(10) < @Override public String color() < return "silver"; >>, QUARTER(25) < @Override public String color() < return "silver"; >>; private int value; public abstract String color(); private Currency(int value) < this.value = value; >>
В этом примере, поскольку каждая монета будет иметь разный цвет, мы сделали метод color() абстрактным и позволили каждому экземпляру Enum определять свой собственный цвет. Вы можете получить цвет любой монеты, просто вызвав метод color(), как показано в примере ниже:
System.out.println("Color: " + Currency.DIME.color());
Средняя оценка 4.7 / 5. Количество голосов: 25
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Java 8 перечисления
Тип enum — это специальный тип, который позволяет переменной иметь одно из предопределённых константных значений. Объявление перечислений схоже с объявлениями классов: модификатор доступа, ключевое слово enum (НЕ class !), имя типа, тело перечисления. Тело перечисления содержит имена предопределённых константных значений.
Затем можно объявить переменную нашего созданного типа перечисления:
Используйте перечисления всегда, когда вам нужен набор предопределённых связанных между собой констант.
Перечисления в Java являются классами.
Все перечисления неявно наследуются от класса java.lang.Enum. Поскольку в Java нет множественного наследования, то перечисление не может наследоваться от какого-либо другого класса дополнительно, но может реализовывать сколько угодно интерфейсов.
Из класса java . lang . Enum каждое перечисление получает пару полезных методов:
Возвращает порядковый номер константы в перечислении. Нумерация начинается с нуля.
Метод name ( ) возвращает имя константы так, как оно было объявлено в перечислении. Например, NORTH .
Также все перечисления неявно становятся final , если у них нет ни одной константы с телом класса (описано ниже). Нельзя указывать перечисление в качестве расширяемого класса. Нельзя указывать модификаторы final и abstract для перечислений.
Вложенные перечисления всегда неявно static . Нельзя явно указывать этот модификатор, иначе будет ошибка компиляции.
Так как вложенные перечисления являются статическими, то отсюда вытекает, что анонимные классы; лямбда выражения; внутренние классы, являющиеся нестатическими членами класса, и локальные классы НЕ могут содержать перечислений.
К каждому перечислению компилятор добавляет статический метод values ( ) , который возвращает массив возможных значений для перечисления в том порядке, в котором они объявлены, и статический метод valueOf ( String name ) , который возвращает ссылку на константу перечисления по её имени.
Константные значения перечислений ( Direction . NORTH , Direction , EAST и т. д.) являются экземплярами этого класса перечисления ( Direction ), но их можно сравнивать через == , так как для каждой из этих констант всегда будет существовать только один объект. Нельзя пытаться создать экземпляр перечисления вручную любым способом — будет ошибка компиляции. Reflection, метод clone ( ) и механизм сериализации/десериализации гарантируют, что не произойдёт создания нового объекта.
Для каждого константного значения в перечислении создаётся поле с модификаторами public static final , с тем же именем, что и константное значение. Это поле имеет выражение инициализации этой константой и имеет те же аннотации, что и константное значение.
Объявление констант в перечислении позволяет указать параметры для конструктора перечисления:
Перечисление может иметь несколько конструкторов, тогда подходящий выбирается по параметрам. Перечисление не может содержать конструкторов с модификаторами доступа public или protected . Конструктор без модификатора доступа в перечислении становится приватным ( private ).
Если в перечислении нет ни одного объявления конструктора, то автоматически добавляется конструктор по умолчанию без параметров, с модификатором доступа private и без списка возможных исключений.
Если конструктор перечисления содержит ключевое слово super , то возникает ошибка компиляции.
Нельзя обращаться к статическим полям перечисления, если они не являются константами (например, public static int CONST1 = 200 ; ), из конструкторов, блоков инициализации экземпляров, выражений инициализации.
Константы перечисления могут содержать тело класса, тогда эти классы автоматически являются анонимными и наследуются от класса текущего перечисления. Перечисление может содержать абстрактные методы, но тогда все константы должны иметь тело класса, в котором обязательно должны реализовать все абстрактные методы: