Почему в 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