【问题标题】:Why can't I create an enum in an inner class in Java?为什么我不能在 Java 的内部类中创建枚举?
【发布时间】:2013-01-29 06:19:51
【问题描述】:

我尝试做的是:

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

【问题讨论】:

标签: java enums nested inner-classes


【解决方案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;

【讨论】:

    【解决方案2】:

    如果你这样声明一个枚举:

    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),并且由于枚举合成类具有,因此无法将其作为内部类。

    【讨论】:

    • 不应该是final static class Suit extends java.lang.Enum&lt;Suit&gt;而不是final class Suit extends java.lang.Enum&lt;Suit&gt;,因为枚举有静态变量(SPADES, CLUBS etc)和一个内部(嵌套的非静态)类不能有静态声明?跨度>
    【解决方案3】:

    +Joachim Sauer 已经提供了足够的信息,我只是添加了一些额外的细节。

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

    private static class DbResource {
    
        public enum DB {
            MERGE_FROM, MERGE_TO, MAIN;
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      您不能在非静态类型中包含静态嵌套类型(也称为“内部类”,请参阅 JLS §8.1.3. Inner Classes and Enclosing Instances)。

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

      【讨论】:

      • 嵌套的enum类型是否隐含static
      • @mrbela:如果允许非静态嵌套enum 类型,那么枚举值应该引用什么封闭类实例?这种想法与enum 类型的基本原则不兼容(即存在一组有限的、明确定义的实例)。
      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 2021-09-11
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多