128

内部クラスの内部からアクセスできるように、列挙型の内部から周囲のクラスのインスタンスメンバーにアクセスできないようです。それは列挙型が静的であることを意味しますか?周囲のクラスのインスタンスのスコープへのアクセスはありますか、それとも必要な場所でインスタンスを列挙型のメソッドに渡す必要がありますか?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}
4

2 に答える 2

183

はい、ネストされた列挙型は暗黙的に静的です。

言語仕様セクション8.9から:

ネストされた列挙型は暗黙的に静的です。ネストされた列挙型を静的であると明示的に宣言することは許可されています。

于 2009-03-19T20:10:53.553 に答える
48

インスタンス レベル (非静的) の内部列挙型クラスを作成しても意味がありません。列挙型インスタンス自体が外部クラスに関連付けられている場合、列挙型の保証が破られます。

たとえば、あなたが持っていた場合

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

列挙値が定数として適切に機能するように (疑似コード、アクセス制限を無視)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 と b2 は同じオブジェクトでなければなりません。

于 2009-03-19T20:16:32.823 に答える