60 votes

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

Puisque le constructeur d'un enum ne peut être invoqué que par ses constantes, pourquoi est-il autorisé à être privé par paquet ?

100voto

ColinD Points 48573

Le constructeur n'est en fait pas package-private... 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 de la JLS ( §8.8.3 ) déclare :

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

Si aucun modificateur d'accès n'est spécifié pour le constructeur d'un type d'énumération, le constructeur est private .

C'est une erreur de compilation si le constructeur d'un type énumé (§8.9) est déclaré public o protected .

4voto

Bohemian Points 134107

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

Il est intéressant de noter que si vous déclarez un constructeur d'enum visible par le paquet, 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 à partir d'une autre classe du paquet. Si vous essayez, vous obtenez une erreur de compilation :

Impossible d'instancier le type MyEnum

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X