Puisque le constructeur d'un enum ne peut être invoqué que par ses constantes, pourquoi est-il autorisé à être privé par paquet ?
Réponses
Trop de publicités?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
oprotected
.
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