web-dev-qa-db-ja.com

列挙型にパッケージプライベートコンストラクターを設定できるのはなぜですか?

Enumコンストラクターはその定数によってのみ呼び出すことができるので、なぜそれがパッケージプライベートであることが許可されるのですか?

55
Tobias

コンストラクターは実際にはパッケージプライベートではありません...暗黙的にprivateです。キーワードを追加しなくても、インターフェイスメソッドが暗黙的にpublicになります。

JLSの関連セクション( §8.8. )は次のように述べています。

通常のクラスのコンストラクターにアクセス修飾子が指定されていない場合、コンストラクターにはデフォルトのアクセス権があります。

列挙型のコンストラクターにアクセス修飾子が指定されていない場合、コンストラクターはprivateです。

列挙型(8.9)のコンストラクタがpublicまたはprotectedと宣言されている場合、コンパイル時エラーになります。

91
ColinD

これは言語の癖です。列挙型コンストラクタは暗黙的にプライベートです。

興味深いことに、次のように、パッケージに表示される列挙型コンストラクタを宣言すると、

public enum MyEnum {
    A(0),
    B(1);

    private final int i;

    MyEnum(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }
}

パッケージ内の別のクラスから参照することはできません。実行しようとすると、コンパイラエラーが発生します。

タイプMyEnumをインスタンス化できません

4
Bohemian