Pourquoi un enum peut-il avoir un constructeur privé de paquet?

Comme un constructeur enum ne peut être appelé que par ses constantes, pourquoi est-il alors autorisé à être package-private?

    Le constructeur n’est en fait pas un paquet privé … il est implicitement private la façon dont les méthodes d’interface sont implicitement public même si vous n’ajoutez pas le mot-clé.

    La section pertinente du JLS ( §8.8.3 ) indique:

    Si aucun modificateur d’access n’est spécifié pour le constructeur d’une classe normale, le constructeur dispose d’un access par défaut.

    Si aucun modificateur d’access n’est spécifié pour le constructeur d’un type enum, le constructeur est private .

    C’est une erreur de compilation si le constructeur d’un type enum (§8.9) est déclaré public ou protected .

    C’est un caprice du langage: les constructeurs enum sont implicitement privés.

    Fait intéressant, si vous déclarez un constructeur enum de paquet-visible, comme ceci:

     public enum MyEnum { A(0), B(1); private final int i; MyEnum(int i) { this.i = i; } public int getI() { return i; } } 

    vous ne pouvez pas vous y référer d’une autre classe du package. Si vous essayez, vous obtenez l’erreur de compilation:

    Impossible d’instancier le type MyEnum