web-dev-qa-db-fra.com

Pourquoi une énumération peut-elle avoir un constructeur privé de package?

Puisqu'un constructeur enum ne peut être appelé que par ses constantes, pourquoi est-il alors autorisé à être privé de package?

55
Tobias

Le constructeur n'est en fait pas privé du package ... c'est implicitement private comme 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. ) indique:

Si aucun modificateur d'accès n'est spécifié pour le constructeur d'une classe normale, le constructeur a l'accès par défaut.

Si aucun modificateur d'accès 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.

91
ColinD

C'est une bizarrerie du langage: les constructeurs d'énumérations sont implicitement privés.

Fait intéressant, si vous déclarez un constructeur d'énumération visible par package, 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 y faire référence depuis une autre classe du package. Si vous essayez, vous obtenez l'erreur du compilateur:

Impossible d'instancier le type MyEnum

4
Bohemian