Перечисления enum

Последнее обновление: 26.09.2025

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

enum имя_перечисления{

    константа_1,
    константа_2,
    ........................
    константа_N,
}

После названия перечисления в фигурных скобках через запятую идет список элементов перечисления. Например:

enum DayTime{

    MORNING,
    AFTERNOON,
    EVENING,
    NIGHT
}

Здесь определено перечисление DayTime, которое имеет четыре значения: MORNING, AFTERNOON, EVENING, NIGHT. Названия констант произвольны, но в Java часто определяются в вернем регистре.

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

class Program{
      
    public static void main(String[] args) {

        DayTime current = DayTime.MORNING;
		System.out.println(current);	// MORNING
    }
}
enum DayTime{

    MORNING,
    AFTERNOON,
    EVENING,
    NIGHT
}

Обратите внимание, что при использовании констант нам надо указывать их полное имя с учетом перечисления:

DayTime current = DayTime.MORNING;

При выводе на консоль константа перечисления преобразуется в строку, которая фактически представляет название этой константы, например, для DayTime.MORNING это "MORNING".

Перечисления в конструкциях/выражениях switch

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

class Program{
      
    public static void main(String[] args) {

        DayTime current = DayTime.MORNING;
        String message = getMessage(current);
		System.out.println(message);	// Доброе утро

        message = getMessage(DayTime.EVENING);
        System.out.println(message);	// Добрый вечер
    }

    static String getMessage(DayTime dt){

        return switch(dt){
            case MORNING -> "Доброе утро";
            case AFTERNOON -> "Добрый день";
            case EVENING -> "Добрый вечер";
            case NIGHT -> "Доброй ночи";
        };
    }
}
enum DayTime{

    MORNING,
    AFTERNOON,
    EVENING,
    NIGHT
}

Перечисления для хранения состояния

Перечисления удобно использовать в классах для хранения состояния:

class Program{
      
    public static void main(String[] args) {

        Operation sum = new Operation(OpType.ADD, 5, 4);
        System.out.println(sum.execute());	// 9

        Operation sub = new Operation(OpType.SUBTRACT, 5, 4);
        System.out.println(sub.execute());	// 1

        Operation mul = new Operation(OpType.MULTIPLY, 5, 4);
        System.out.println(mul.execute());	// 20
    }
}
enum OpType{

    ADD,
    SUBTRACT,
    MULTIPLY
}
class Operation{
    
    private OpType type;
    private int op1;
    private int op2;

    Operation(OpType type, int op1, int op2){
        this.type = type;
        this.op1 = op1;
        this.op2 = op2;
    }

    int execute(){
        return switch(type){

            case ADD -> op1 + op2;
            case SUBTRACT -> op1 - op2;
            case MULTIPLY -> op1 * op2;
        };
    }
}

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

Методы перечислений

Каждое перечисление имеет статический метод values(). Он возвращает массив всех констант перечисления:

class Program{
      
    public static void main(String[] args) {

        DayTime[] dts = DayTime.values();
        for(DayTime dt: dts){
            System.out.println(dt);    
        }
    }
}
enum DayTime{

    MORNING,
    AFTERNOON,
    EVENING,
    NIGHT
}

Консольный вывод:

MORNING
AFTERNOON
EVENING
NIGHT

Метод ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0):

class Program{
      
    public static void main(String[] args) {

        var current = DayTime.MORNING;
        System.out.println(current.ordinal());  // 0

        System.out.println(DayTime.AFTERNOON.ordinal());  // 1
    }
}

Данный метод удобен для создания карт сопоставления:

class Program{
      
    static String[] messages = {"Доброе утро", "Добрый день", "Добрый вечер", "Доброй ночи"};

    public static void main(String[] args) {

        var current = DayTime.EVENING;
        System.out.println(messages[current.ordinal()]);  // Добрый вечер
    }
}
enum DayTime{

    MORNING,
    AFTERNOON,
    EVENING,
    NIGHT
}

Конструкторы, поля и методы перечисления

Перечисления, как и обычные классы, могут определять конструкторы, поля и методы. Например:

class Program{

    public static void main(String[] args) {

        var current = DayTime.EVENING;
        System.out.println(current.getMessage());  // Добрый вечер
    }
}
enum DayTime{

    MORNING ("Доброе утро"), AFTERNOON("Добрый день"), EVENING("Добрый вечер"), NIGHT("Доброй ночи");

    private String message;
	DayTime(String message){
		this.message = message;
	}
	public String getMessage(){ return message;}
}

Перечисление DayTome определяет приватное поле message для хранения сообщения, связанного со значением перечисления, а с помощью метода getMessage оно возвращается. Через конструктор передается для него значение.

Следует отметить, что конструктор по умолчанию приватный, то есть имеет модификатор private. Любой другой модификатор будет считаться ошибкой. Поэтому создать константы перечисления с помощью конструктора мы можем только внутри перечисления.

Определение методов

Также можно определять методы для отдельных констант:

class Program{
      
    public static void main(String[] args) {
          
        Operation op = Operation.SUM;
        System.out.println(op.action(10, 4));   // 14
        op = Operation.MULTIPLY;
        System.out.println(op.action(6, 4));    // 24
    }
}
enum Operation{
    SUM{
        int action(int x, int y){ return x + y;}
    },
    SUBTRACT{
        int action(int x, int y){ return x - y;}
    },
    MULTIPLY{
        int action(int x, int y){ return x * y;}
    };
    abstract int action(int x, int y);
}
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850
Morty Proxy This is a proxified and sanitized view of the page, visit original site.