web-dev-qa-db-ja.com

Javaでは、クラス内の列挙型は静的ですか?

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

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;
    }
}
118
Hanno Fietz

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

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

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

171
Jon Skeet

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

例えばもしあれば

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

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

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

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

45
Steve B.