Почему не могут быть защищены или публиковаться в 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.

Ответ 1

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

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

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

Ответ 2

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

Вот что пособия на Enums должны сказать:

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

Ответ 3

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

Ответ 4

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

Ответ 5

если вы хотите объявить enum public, затем сохраните файл enum с именем enum.

Предположим, вы сделали enum Book{}, затем сохраните его Book.java и сделайте отдельный файл для класса

это единственный способ объявить enum public.