Почему конструкторы enum не могут быть защищены или общедоступны в Java? - PullRequest
66 голосов
/ 08 сентября 2010

Весь вопрос в заголовке.Например:

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.

Ответы [ 5 ]

88 голосов
/ 08 сентября 2010

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

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

19 голосов
/ 08 сентября 2010

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

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

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

8 голосов
/ 08 сентября 2010

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

1 голос
/ 16 июля 2018

Это потому, что 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 голосов
/ 26 мая 2016

Важно помнить, что перечисления, которые не заключены в класс, могут быть объявлены только с модификатором public или по умолчанию , как и не внутренний класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...