Перейти к контенту

Что такое перечисления в 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);
}
}

Вывод:

EAST

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);
}
}

Вывод:

EAST

Первая строка внутри типа 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;
}

Вывод:

South Direction

Values() и метод ValueOf()

Values(): при создании enum компилятор Java внутренне добавляет метод values(). Этот метод возвращает массив, содержащий все значения перечисления.

Синтаксис:

public static enum-type[ ] values()

ValueOf(): этот метод используется для возврата константы перечисления, значение которой равно строке, переданной в качестве аргумента при вызове этого метода.

Синтаксис:

public static enum-type valueOf (String str)

Теперь давайте напишем программу, чтобы понять эти методы более подробно.

enum Colors{
black, red blue, pink, white
}
class Test {
public static void main(String args[]) {
Colors c;
System.out.println("All constants of enum type Colors are:");
Colors cArray[] = Colors.values(); //returns an array of constants of type Colors
for(Colors a : cArray) //using foreach loop
System.out.println(a);
c = Colors.valueOf("red");
System.out.println("I Like" + c);
}
}

Вывод:

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");
}
}

Вывод:

Age of Victor is 9 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). Вы можете указать значения констант перечисления во время создания, как показано в примере ниже:

public enum Currency {PENNY(1), NICKLE(5), DIME(10), QUARTER(25)};

Но для этого вам необходимо определить переменную-член и конструктор, потому что PENNY (1) фактически вызывает конструктор, который принимает значение int, см. Пример ниже.

public enum Currency { 
PENNY(1), NICKLE(5), DIME(10), QUARTER(25); 
private int value; 
private Currency(int value) { 
this.value = value; } };

Конструктор должен быть закрытым, любой другой модификатор доступа приведет к ошибке компиляции. Теперь, чтобы получить значение, связанное с каждой монетой, вы можете определить общедоступный метод getValue() внутри перечисления Java, как любой обычный класс. Кроме того, точка с запятой в первой строке не обязательна.

4) Константы перечисления неявно статичны и окончательны и не могут быть изменены после создания. Например, приведенный ниже код приведет к ошибке компиляции:

Currency.PENNY = Currency.DIME;

Последнее поле EnumExamples.Currency.PENNY нельзя переназначить.

5) Может использоваться в качестве аргумента в операторе switch и с «case:», например, с примитивным типом int или char. Эта особенность делает их очень полезными для операций переключения. Давайте посмотрим, как использовать enum внутри оператора switch:

Currency usCoin = Currency.DIME;
    switch (usCoin) {
            case PENNY:
                    System.out.println("Penny coin");
                    break;
            case NICKLE:
                    System.out.println("Nickle coin");
                    break;
            case DIME:
                    System.out.println("Dime coin");
                    break;
            case QUARTER:
                    System.out.println("Quarter coin");
 }

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

Currency usCoin = Currency.DIME; 
if(usCoin == Currency.DIME){ 
System.out.println("enum in java can be compared using =="); 
}

Сравнение объектов с использованием оператора == не рекомендуется. Всегда используйте метод equals() или compareTo() для сравнения объектов.

7). Компилятор Java автоматически генерирует метод static values() для каждого перечисления. Метод Values() возвращает массив констант Enum в том же порядке, в котором они перечислены, и вы можете использовать values() для перебора значений, как показано в примере ниже:

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());

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)