内部enumはstatic扱い

あるクラスCに内部enum Eを定義する場合、staticキーワードをつけるべきだろうか?

enumはその性質上staticと扱われないといろいろ不都合が生じるため、内部enumを作る場合にはstaticにしないといけない気がするが、ではstaticキーワードをつけないとどうなるのだろうか。

public class C {
    public enum E {};
}

Eが持つコンストラクタを調べてみる。

for (Constructor<?> c : E.class.getDeclaredConstructors()) {
    System.out.println(c);
}

すると以下のようになる。

public C$E(java.lang.String,int)

staticでない内部クラスは第一引数として親クラスを受け取るようなコンストラクタを持つが、staticキーワードをつけないで内部enumを定義すると、そのようなコンストラクタを持たないことが分かる。すなわち、

内部enumはstaticキーワードをつけなくてもstaticとして定義される

ということのようだ。

実際、staticキーワードをつけて内部enumを定義してみると、

public class C {
    public static enum StaticE {};
}
for (Constructor<?> c : StaticE.class.getDeclaredConstructors()) {
    System.out.println(c);
}

以下のようにstaticキーワードをつけなかった場合と同じ結果になる。

public C$StaticE(java.lang.String,int)

追伸:このあたりのことってきっとJava言語仕様に書いてあるんだろうなぁ…。