Так как конструктор перечисления может быть вызван только его константами, почему тогда ему разрешено быть закрытым пакетом?
Почему в enum есть пакет-частный конструктор?
Ответ 1
Конструктор на самом деле не является приватным пакетом... он неявно private
способ неявно public
, если вы не добавляете ключевое слово.
В соответствующем разделе JLS (§8.8.3) указано:
Если для конструктора нормального класса не задан модификатор доступа, конструктор имеет доступ по умолчанию.
Если для конструктора типа перечисления не задан модификатор доступа, конструктор
private
.Это ошибка времени компиляции, если объявлен конструктор типа перечисления (§8.9)
public
илиprotected
.
Ответ 2
Это причуда языка: конструкторы enum неявно закрыты.
Интересно, что если вы объявляете конструктор перечисляемых пакетов, как это:
public enum MyEnum {
A(0),
B(1);
private final int i;
MyEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
вы не можете ссылаться на него из другого класса в пакете. Если вы попытаетесь, вы получите ошибку компилятора:
Невозможно создать экземпляр типа MyEnum