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

问题描述 投票:54回答:4

我尝试做的是:

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

java enums nested inner-classes
4个回答
87
投票

定义为嵌套类型的enum类型总是隐式static(参见JLS §8.9. Enums

你不能在非静态类型中使用静态嵌套类型(a.k.a是“内部类”,请参阅JLS §8.1.3. Inner Classes and Enclosing Instances)。

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


12
投票

如果您声明了这样的枚举:

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. Inner Classes and Enclosing Instances),并且由于enum合成类的确如此,它使得内部类无法接受。


5
投票

来自+ Joachim Sauer的足够信息,我只是添加了一些额外的细节。

仅当内部类是静态嵌套内部类时,才可以定义内部枚举。见下文

private static class DbResource {

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

1
投票

这适用于我的用例:

public class History {

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

    //Inner class
    public class State implements HConstants{
        public StateType stateField = StateType.PAST;
© www.soinside.com 2019 - 2024. All rights reserved.