Подтвердить что ты не робот

Почему в enum есть пакет-частный конструктор?

Так как конструктор перечисления может быть вызван только его константами, почему тогда ему разрешено быть закрытым пакетом?

4b9b3361

Ответ 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