it-roy-ru.com

Почему конструкторы enum не могут быть защищены или общедоступны в Java?

Весь вопрос в названии. Например:

enum enumTest {

        TYPE1(4.5, "string1"), TYPE2(2.79, "string2");
        double num;
        String st;

        enumTest(double num, String st) {
            this.num = num;
            this.st = st;
        }
    }

Конструктор подходит для модификатора по умолчанию или private, но выдает ошибку компилятора, если заданы модификаторы public или protected.

65
Bad Request

Думайте о Enums как о классе с конечным числом экземпляров. Никогда не может быть никаких других экземпляров, кроме тех, которые вы первоначально объявляете.

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

Примечание: это, вероятно, не официальная причина. Но для меня имеет смысл думать о enums таким образом.

86
jjnguy

Потому что вы не можете вызвать конструктор самостоятельно.

Вот что говорит учебники по Enums :

Примечание: Конструктор для типа enum должен иметь частный или частный доступ к пакету. Он автоматически создает константы, которые определены в начале тела enum. Вы не можете вызвать конструктор enum самостоятельно. 

17
Cristian Sanchez

Перечисления содержат фиксированный набор значений, которые должны быть известны во время компиляции. Не имеет смысла создавать новые литералы во время выполнения, что было бы возможно, если бы конструктор был видимым.

8
harto

Это связано с тем, что enum is Java содержит фиксированные постоянные значения. Поэтому нет смысла иметь открытый или защищенный конструктор, так как вы не можете создать экземпляр enum.

Также обратите внимание, что внутренне enum преобразуется в класс, как показано ниже.

enum Color {
 RED, BLUE, YELLOW;
}

Это будет внутренне преобразовано в:

public final class Color {
 private Color() {}
 public static final Color RED = new Color();
 public static final Color BLUE = new Color();
 public static final Color YELLOW = new Color();
}

Таким образом, каждая константа перечисления представляется как объект типа enum. Поскольку мы не можем создавать объекты enum явно, следовательно, мы не можем вызвать конструктор enum напрямую.

0
Praveen Kishor