Типы данных, перечислимые типы

___

Типы данных

Конструкция Enum

Давайте опишем с помощью enum тип данных для хранения времени года:

enum Season { 
    WINTER, SPRING, SUMMER, AUTUMN
}

Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season); //SUMMER

Перечисление - это класс

Объявляя enum мы неявно создаем класс производный от java.lang.Enum. Условно конструкция enum Season { ... } эквивалентна class Season extends java.lang.Enum { ... }.

И хотя явным образом наследоваться от java.lang.Enum нам не позволяет компилятор, все же в том, что enum наследуется, легко убедиться с помощью reflection:

System.out.println(Season.class.getSuperclass());// class java.lang.Enum

Элементы перечисления - экземпляры enum-класса, доступные статически

Элементы enum Season (WINTER, SPRING и т.д.) - это статически доступные экземпляры enum-класса Season. Их статическая доступность позволяет нам выполнять сравнение с помощью оператора сравнения ссылок ==.

Пример:

Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Название и порядковый номер элемента enum

Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" +
                                season.toString() + " season.ordinal()=" + season.ordinal());

// Prints

Получение элемента enum по строковому представлению его имени

Довольно часто возникает задача получить элемент enum по его строковому представлению. Для этих целей в каждом enum-классе компилятор автоматически создает специальный статический метод: public static EnumClass valueOf(String name), который возвращает элемент перечисления EnumClass с названием, равным name.

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

String name = "WINTER";
Season season = Season.valueOf(name);

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

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

public static EnumClass[] values().

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

System.out.println(Arrays.toString(Season.values()));

// Prints

Добавляем свои методы в enum-класс

У Вас есть возможность добавлять собственные методы как в enum-класс, так и в его элементы:

enum Direction {
UP, DOWN;
public Direction opposite() { return this == UP ? DOWN : UP; }
}

То же, но с полиморфизмом:

enum Direction {
UP {
    public Direction opposite\(\) { return DOWN; }
},
DOWN {
    public Direction opposite\(\) { return UP; }
};
public abstract Direction opposite();
}

results matching ""

    No results matching ""