64

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

4

2 に答える 2

100

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

JLSの関連セクション(§8.8.3)には次のように記載されています。

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

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

列挙型(§8.9)のコンストラクターが宣言されている場合はコンパイル時エラーpublicですprotected

于 2011-10-13T00:44:21.547 に答える
5

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

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

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

    private final int i;

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

    public int getI() {
        return i;
    }
}

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

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

于 2011-10-13T02:01:01.693 に答える