Java Enum (enum)

Java enum — это специальный класс, который обычно представляет набор констант, таких как 4 сезона года, 12 месяцев года, 7 дней недели и направления, такие как восток, юг, запад, север и т. д.

Классы Java enum определяются с помощью ключевого слова enum, при этом каждая константа отделяется запятой,для их разделения.

Например, определите enum-класс для цветов.

enum Color 
{ 
    RED, GREEN, BLUE; 
} 

Приведенный выше enum-класс Color имеет цветовые константы RED, GREEN, BLUE, представляющие соответственно красный, зеленый и синий.

Пример использования:

Пример

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    // Выполнить и вывести результат
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

При выполнении приведенного выше кода выводится следующий результат:

RED

Использование перечислений во внутренних классах

Классы перечислений также можно объявлять во внутренних классах:

Пример

public class Test
{
    enum Color
    {
        RED, GREEN, BLUE;
    }
 
    // Выполнить и вывести результат
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

При выполнении приведенного выше кода выводится следующий результат:

RED

Каждое перечисление внутренне реализуется через Class, а все значения перечисления являются public static final.

Приведенный выше класс перечисления Color преобразуется в следующую реализацию внутреннего класса:

class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}

Перебор элементов перечисления

Для перебора элементов перечисления можно использовать оператор for:

Пример

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    for (Color myVar : Color.values()) {
      System.out.println(myVar);
    }
  }
}

При выполнении приведенного выше кода выводится следующий результат:

RED
GREEN
BLUE

Использование enum-классов в switch

Enum-классы часто используются в операторах switch:

Пример

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    Color myVar = Color.BLUE;

    switch(myVar) {
      case RED:
        System.out.println("Red");
        break;
      case GREEN:
         System.out.println("Green");
        break;
      case BLUE:
        System.out.println("Blue");
        break;
    }
  }
}

При выполнении приведенного выше кода выводится следующий результат:

Blue

методы values(), ordinal() и valueOf()

Классы перечислений, определённые с помощью enum, по умолчанию наследуют класс java.lang.Enum и реализуют интерфейсы java.lang.Serializable и java.lang.Comparable.

Методы values(), ordinal() и valueOf() находятся в классе java.lang.Enum:

  • values() возвращает все значения в классе перечисления.
  • Метод ordinal() может найти индекс каждой константы enum, точно так же, как индекс массива.
  • Метод valueOf() возвращает константу enum, соответствующую указанному строковому значению.

Пример

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    public static void main(String[] args)
    {
        // Вызов values()
        Color[] arr = Color.values();
 
        // Перебор enum
        for (Color col : arr)
        {
            // Просмотр индекса
            System.out.println(col + " с индексом " + col.ordinal());
        }
 
        // Используйте valueOf(), чтобы вернуть константу перечисления; если она не существует, будет выброшено исключение IllegalArgumentException
        System.out.println(Color.valueOf("RED"));
        // System.out.println(Color.valueOf("WHITE"));
    }
}

При выполнении приведенного выше кода выводится следующий результат:

RED at index 0
GREEN at index 1
BLUE at index 2
RED

Члены класса enum

Как и обычные классы, перечисления могут иметь собственные переменные, методы и конструкторы. Конструкторы могут использовать только модификатор доступа private, поэтому их нельзя вызывать извне.

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

Пример

enum Color
{
    RED, GREEN, BLUE;
 
    // Конструктор
    private Color()
    {
        System.out.println("Вызван конструктор для : " + this.toString());
    }
 
    public void colorInfo()
    {
        System.out.println("Универсальный цвет");
    }
}
 
public class Test
{    
    // Вывод
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
        c1.colorInfo();
    }
}

При выполнении приведенного выше кода выводится следующий результат:

Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color
Другие расширения