Perché i costruttori di enum non possono essere protetti o pubblici in Java?

L’intera domanda è nel titolo. Per esempio:

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; } } 

Il costruttore sta bene con il modificatore predefinito o private , ma mi dà un errore del compilatore se viene dato il modificatore public o protected .

Pensa a Enums come a una class con un numero finito di istanze. Non possono esserci mai istanze diverse oltre a quelle che dichiari inizialmente.

Pertanto, non è ansible avere un costruttore pubblico o protetto, poiché ciò consentirebbe la creazione di più istanze.

Nota: questo probabilmente non è il motivo ufficiale. Ma per me è più sensato pensare a enums questo modo.

Perché non puoi chiamare tu stesso il costruttore.

Ecco cosa ha da dire i tutorial su Enums :

Nota: il costruttore per un tipo enum deve essere un accesso privato o privato del pacchetto. Crea automaticamente le costanti che sono definite all’inizio del corpo enum. Non puoi invocare un enum constructor da solo.

Le enumerazioni contengono un insieme fisso di valori, che devono essere tutti noti al momento della compilazione. Non ha senso creare nuovi letterali in fase di esecuzione, cosa che sarebbe ansible se il costruttore fosse visibile.

Il punto chiave da ricordare è che un’enumerazione che non è racchiusa in una class può essere dichiarata solo con il modificatore pubblico o predefinito , proprio come una class non interna.

Questo perché enum è Java contiene valori costanti fissi. Quindi, non ha senso avere un costruttore pubblico o protetto in quanto non è ansible creare un’istanza di enum.

Inoltre, si noti che internamente enum viene convertito in class come di seguito.

 enum Color { RED, BLUE, YELLOW; } 

Questo verrà convertito internamente in:

 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(); } 

Quindi, ogni costante enum viene rappresentata come object di enum di tipo. Dato che non possiamo creare oggetti enum in modo esplicito, non possiamo invocare direttamente enum constructor.

se vuoi dichiarare pubblico enum salva il file enum con il nome enum .

Supponete di creare un enum Book{} quindi salvarlo da Book.java e creare un file separato per la class

questo è l’unico modo per dichiarare l’ enum pubblico.