Типы данных, перечислимые типы
___
Типы данных
Конструкция 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();
}