【问题标题】:Inner Enum in non-static context非静态上下文中的内部枚举
【发布时间】:2013-11-23 22:38:30
【问题描述】:

据我了解,内部枚举在 java 中总是显式或隐式静态的。这意味着我无法从我的内部枚举类中访问实例字段。

public class InnerEnum {
    private enum SomeInnerEnum {
        VALUE1() {
            @Override
            public void doSomething() {
                // ERROR: WON'T COMPILE
                // Cannot make static reference
                // to non-static field i
                System.out.println(i);
            }
        },
        VALUE2() {
            @Override
            public void doSomething() {
                // do something else with i 
            }
        };

        public abstract void doSomething();
    }

    private int i = 10;
}

我发现在每个枚举常量中重写方法非常方便,所以我可以在我的外部类中使用它。是不是java中不好的编程风格,因为实际上是被禁止的?

有什么方法可以通过访问我的实例变量来创建内部枚举?

提前致谢。

【问题讨论】:

  • this 传递给doSomething() 以访问i
  • +1 我什至不知道内部枚举存在。我会查找这是在哪个版本的 java 中引入的。
  • @TejaswiRana 引入枚举的 Java 版本相同。
  • "在java中是不是一种不好的编程风格,因为它实际上是被禁止的?"这个问题没有意义。这是被禁止的,所以它不是Java中的任何种编程风格。

标签: java enums inner-classes instance-variables


【解决方案1】:

有什么方法可以通过访问我的实例来创建内部枚举 变量?

enum 是一个编译时构造(预定义),因此其中的任何外部数据都必须在运行前可供编译器使用。

除非您将变量(或包含它的一些引用,在您的情况下为 this)明确传递给 enum 内的方法,否则您将无法引用它。

【讨论】:

    【解决方案2】:

    我发现在每个枚举常量中重写方法非常方便,所以我可以在我的外部类中使用它。是不是java中不好的编程风格,因为实际上是被禁止的?

    在枚举常量中覆盖方法本身并没有错。与任何其他语言结构一样,如果使用得当,这不是坏习惯。

    我不确定您所说的“所以我可以在我的外部类中使用它”是什么意思,但总的来说,枚举不应严重依赖于外部代码。它们旨在描述一组固定的常量值,并且几乎不需要或不需要与其他类型的耦合来实现这一点(无论如何,除了原始类型和字符串等核心类型之外)。我觉得枚举常量访问外部类型的 instance-level 成员的设计有问题。

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多