public enum Day {
SUNDAY(), MONDAY, TUESDAY(2), WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
int value;
private Day(int value) {
System.out.println("arg cons");
this.value = value;
}
private Day() {
System.out.println("no arg cons");
}
public static void main(String args[]) {
}
}
Выход:
no arg cons
no arg cons
arg cons
no arg cons
no arg cons
no arg cons
no arg cons
Представьте перечисление следующим образом:
SUNDAY()
эквивалентно static final Day SUNDAY = new Day();
MONDAY
также эквивалентно static final Day MONDAY = new Day(); // without paranthesis it calls the no-arg constructor/default no-arg constrctor if no other constructor
TUESDAY(2)
эквивалентно static final Day TUESDAY = new Day(2);
Поскольку enum должен рассматриваться как особый тип класса, он допускает «статический» объект
создание. Поскольку вы не можете создавать объекты вне класса enum, все создания объектов происходят на самом уровне объявления класса, и поэтому здесь имеет смысл «статический» для создания объекта.
В Enum все создания объектов (то есть создания статических конечных констант, если быть точным) должны происходить изнутри самого класса enum (и, следовательно, частного конструктора), поскольку цель Enum - иметь только фиксированный набор значимые константы по отношению к вашему приложению и исключить неоправданные утверждения / экземпляры, такие как Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)