Enumコンストラクターはその定数によってのみ呼び出すことができるので、なぜそれがパッケージプライベートであることが許可されるのですか?
コンストラクターは実際にはパッケージプライベートではありません...暗黙的にprivate
です。キーワードを追加しなくても、インターフェイスメソッドが暗黙的にpublic
になります。
JLSの関連セクション( §8.8. )は次のように述べています。
通常のクラスのコンストラクターにアクセス修飾子が指定されていない場合、コンストラクターにはデフォルトのアクセス権があります。
列挙型のコンストラクターにアクセス修飾子が指定されていない場合、コンストラクターは
private
です。列挙型(8.9)のコンストラクタが
public
またはprotected
と宣言されている場合、コンパイル時エラーになります。
これは言語の癖です。列挙型コンストラクタは暗黙的にプライベートです。
興味深いことに、次のように、パッケージに表示される列挙型コンストラクタを宣言すると、
public enum MyEnum {
A(0),
B(1);
private final int i;
MyEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
パッケージ内の別のクラスから参照することはできません。実行しようとすると、コンパイラエラーが発生します。
タイプMyEnumをインスタンス化できません