我似乎无法从枚举中访问周围类的实例成员,因为我可以从内部类中访问.这是否意味着枚举是静态的?是否可以访问周围类的实例的范围,或者我是否必须将实例传递到我需要它的枚举方法中?
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; } }
Jon Skeet.. 171
是的,嵌套枚举是隐式静态的.
从语言规范部分8.9:
嵌套枚举类型是隐式静态的.允许将嵌套的枚举类型显式声明为静态是允许的.
Steve B... 45
创建一个实例级(非静态)内部枚举类是没有意义的 - 如果枚举实例本身与外部类绑定,则它们会破坏枚举保证 -
例如,如果你有
public class Foo { private enum Bar { A, B, C; } }
使枚举值正确地充当常量,(伪代码,忽略访问限制)
Bar b1 = new Foo().A Bar b2 = new Foo().A
b1和b2必须是相同的对象.
是的,嵌套枚举是隐式静态的.
从语言规范部分8.9:
嵌套枚举类型是隐式静态的.允许将嵌套的枚举类型显式声明为静态是允许的.
创建一个实例级(非静态)内部枚举类是没有意义的 - 如果枚举实例本身与外部类绑定,则它们会破坏枚举保证 -
例如,如果你有
public class Foo { private enum Bar { A, B, C; } }
使枚举值正确地充当常量,(伪代码,忽略访问限制)
Bar b1 = new Foo().A Bar b2 = new Foo().A
b1和b2必须是相同的对象.