在Java中,类中的枚举类型是静态的吗?

2022-08-31 08:32:17

我似乎无法从枚举内部访问周围类的实例成员,就像我可以从内部类内部访问的那样。这是否意味着枚举是静态的?是否可以访问周围类实例的作用域,或者我是否必须将实例传递到需要的枚举方法中?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}

答案 1

是的,嵌套枚举是隐式静态的。

语言规范部分 8.9:

嵌套枚举类型是隐式静态的。允许将嵌套枚举类型显式声明为静态。


答案 2

创建一个实例级(非静态)内部枚举类是没有意义的 - 如果枚举实例本身绑定到外部类,它们会破坏枚举保证 -

例如,如果您有

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

使枚举值正确充当常量(伪代码,忽略访问限制)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 和 b2 必须是相同的对象。