非静态上下文中的内部枚举

时间:2013-11-11 23:26:22

标签: java enums inner-classes instance-variables

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:1)

  

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

枚举常量中的重写方法没有任何内在错误。与任何其他语言结构一样,如果使用得当,这也不错。

我不确定你的意思是“所以我可以在外层使用它”,但一般来说,枚举不应该严重依赖于外部代码。它们旨在描述一组固定的常量值,并且需要很少或不需要与其他类型的耦合来实现它(除了核心类型,如基元和字符串,无论如何)。对于访问外部类型的实例级成员的枚举常量,我觉得有点可疑。