enum 実装が enum クラスのプライベート フィールドにアクセスできないのはなぜですか? 質問する

enum 実装が enum クラスのプライベート フィールドにアクセスできないのはなぜですか? 質問する

私はコンパイル問題を解決する方法を述べてこの質問に答えました:

メソッドをオーバーライドして Java 列挙型のフィールドを使用するにはどうすればよいでしょうか?

しかし、そもそもなぜエラーが発生するのかが理解できません。

以下は列挙型として記述された例です。

public enum MyEnum {


    FIRST {
        @Override
        public String doIt() {
            return "1: " + someField; //error
        }
    },
    SECOND {
        @Override
        public String doIt() {
            return "2: " + super.someField; //no error
        }
    };

    private String someField;


    public abstract String doIt();

} 

これは抽象クラスと全く同じものです

abstract class MyClass {
    class FIRST extends MyClass {
        @Override
        public String doIt() {
            return "1: " + someField; //no error
        }
    };
    class SECOND extends MyClass {
        @Override
        public String doIt() {
            return "2: " + super.someField; //no error
        }
    };

    private String someField;

    public abstract String doIt();
}

FIRST実装内のの場合、enumにアクセスできませんsomeField。ただし、抽象クラスの場合には にアクセス可能です。

さらに追加すると、フィールドの修飾子superを削除するのと同様に問題が修正されます。private

この動作のわずかな異常がなぜ起こるのか知っている人はいますか?

ベストアンサー1

列挙型は暗黙的に public static final であるため、抽象クラスは列挙型と同等ではありません。したがって、以下を使用した場合も同じ動作が見られます。

abstract class MyClass {

    static class FIRST extends MyClass {

        @Override
        public String doIt() {
            return "1: " + someField; // error
        }

    };

    static class SECOND extends MyClass {

        @Override
        public String doIt() {
            return "2: " + super.someField; // no error
        }

    };

    private String someField;

    public abstract String doIt();

}

で説明したようにjava.lang.String は、Java EE のネイティブ ライブラリです。、章「静的ネストされたクラス」:

静的ネストされたクラスは、その包含クラスで定義されたインスタンス変数またはメソッドを直接参照することはできません。オブジェクト参照を通じてのみそれらを使用できます。

したがって、 が必要ですsuperthisフィールドが ではprotectedなく の場合は、 を使用することもできますprivate

おすすめ記事