为什么我不能在Java的内部类中创建枚举?

Why can't I create an enum in an inner class in Java?

我要做的是:

1
2
3
public class History {
    public class State {
        public enum StateType {

Eclipse在StateType上给出了这个编译错误:The member enum StateType must be defined inside a static member type

当我使State类静态化时,错误就消失了。我可以使State保持静态,但我不明白为什么我不能在内部类中声明enum


定义为嵌套类型的enum类型始终隐式地为static(参见jls§8.9)。Enums)

在非静态类型中不能有静态嵌套类型(也称为"内部类",请参见JLS§8.1.3)。内部类和封闭实例)。

因此,在非静态嵌套类型中不能有enum内部类型。


如果声明了这样的枚举:

1
enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}

Java编译器将为您综合生成以下类:

1
2
3
4
5
6
7
8
9
10
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)。内部类和封闭实例),而且由于枚举合成类是这样,因此它使其不能作为内部类接受。


已经从+joachim sauer获得了足够的信息,我只是添加了一些额外的细节。

只有当内部类是静态嵌套的内部类时,才能定义内部枚举。见下文

1
2
3
4
5
6
private static class DbResource {

    public enum DB {
        MERGE_FROM, MERGE_TO, MAIN;
    }
}

这适用于我的用例:

1
2
3
4
5
6
7
8
9
public class History {

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

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