Puisqu'un constructeur enum ne peut être appelé que par ses constantes, pourquoi est-il alors autorisé à être privé de package?
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
ouprotected
.
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