2021-05-17 09:00:35
Enumerations, часть 1: обзор
Внутри JVM нет такого понятия как enum. Енумы компилируются в обычный класс, а значения - в статические экземпляры:
public final class Planet extends Enum {
public static final Planet EARTH;
public static final Planet MARS;
}
Полноценные классы c конструкторами, методами, полями и статическими элементами. У экземпляров есть состояние и определённое поведение.
Но есть нюансы:
Суперкласс Enum
От суперкласса Enum наследуются методы
name(),
ordinal() и статический метод
values().
name() возвращает имя переменной,
ordinal() - порядковый номер в списке. На практике эти методы достаточно бесполезны.
Метод
values() используется чаще и возвращает массив всех объектов. Можно пройтись по нему в цикле:
for (Planet p : Planet.values()) {…}
или через Stream API:
Arrays.stream(Planet.values()).forEach(…)
Интерфейсы суперкласса
Enum реализует три интерфейса:
Comparable,
Serializable,
Constable.
Первые два всем знакомы. Интерфейс
Constable определяет методы для размещения объектов в пуле констант внутри JVM.
Создание экземпляров
Этим занимается JVM на старте приложения. Экземпляры енума создаются через приватный конструктор, недоступный вне енума.
Поля
Указываются для каждого экземпляра, инициализируются в конcтрукторе:
public enum Planet {
MARS(3389),
EARTH(6371);
int radius;
Planet(int radius) {
this.radius = radius;
}
}
Два типа методов
Обычные
public int getRadius()
Используется для геттеров и простых вычислений.
В теории можно сделать
set* метод и поменять поле у любого экземпляра. Но на практике так никто не делает. Когда объект доступен из любого места системы, то проще жить, если он неизменяемый.
Абстрактные
Каждый экземпляр определяет свою реализацию:
public enum Planet {
MARS {
int distanceFrom(int) {…}
},
EARTH {
int distanceFrom(int) {…}
};
abstract int distanceFrom(int);
}
Наследование
Любой enum - это final класс с уже определённым суперклассом. Единственный шанс встроить enum в иерархию - добавить для него интерфейс.
Иногда это удобно. Если у енумов и классов один интерфейс, то с ними можно работать через один метод:
interface SpaceObject
enum Planet implements SpaceObject
class Meteor implements SpaceObject
public void getInfo(SpaceObject so)
1.6K views06:00