6

据我了解,内部枚举在 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中一种不好的编程风格,因为它实际上是被禁止的吗?

有没有办法通过访问我的实例变量来创建内部枚举?

提前致谢。

4

2 回答 2

2

有没有办法通过访问我的实例变量来创建内部枚举?

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

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

于 2013-11-11T23:36:19.147 回答
1

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

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

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

于 2013-11-12T00:42:49.890 回答