web-dev-qa-db-ja.com

Javaの内部クラスで列挙型を作成できないのはなぜですか?

私がやろうとしているのはこれです:

public class History {
    public class State {
        public enum StateType {

Eclipseは、StateTypeThe member enum StateType must be defined inside a static member type

Stateクラスを静的にするとエラーは消えます。 Stateを静的にすることはできますが、内部クラスでenumを宣言できない理由がわかりません。

54
Steven Roose

ネストされた型として定義されているenum型は、常に暗黙的にstaticJLS§8.9。Enums を参照)

非静的型の内部に静的なネスト型を持つことはできません(別名「内部クラス」。 JLS§8.1.3。内部クラスと包含インスタンス を参照)。

したがって、enum内部型を非静的なネストされた型の中に含めることはできません。

87
Joachim Sauer

次のような列挙型を宣言した場合:

enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}

Javaコンパイラは、次のクラスを合成的に生成します。

final class Suit extends Java.lang.Enum<Suit> {
  public static final Suit SPADES;
  public static final Suit HEARTS;
  public static final Suit CLUBS;
  public static final Suit DIAMONDS;
  private static final Suit[] $VALUES;
  public static Suit[] values();
  public static Suit valueOf(Java.lang.String);
  private Suit();
}

プライベートコンストラクターから推測できるように、既に定義されている静的フィールド以外にこのクラスの他のインスタンスを作成する意図はありませんが、最も重要なことは、受け入れられた回答で述べられているように、内部クラスに静的メンバーを含めることはできません( JLS§8.1.3。内部クラスと包含インスタンス )、enum合成クラスはそうするため、内部クラスとして受け入れられなくなります。

12
Edwin Dalorzo

+ Joachim Sauerからの十分な情報はすでにありますが、詳細を追加しています。

内部クラスが静的なネストされた内部クラスである場合にのみ、内部列挙型を定義できます。下記参照

private static class DbResource {

    public enum DB {
        MERGE_FROM, MERGE_TO, MAIN;
    }
}
5
Dhiral Pandya

これは私のユースケースでうまくいきました:

public class History {

    public interface HConstants{
         public enum StateType { PAST,CURRENT,FUTURE}
    }

    //Inner class
    public class State implements HConstants{
        public StateType stateField = StateType.PAST;
1
K F