为什么嵌套枚举在java中是隐式静态的?

时间:2013-12-13 17:21:14

标签: java enums

这样做的原因是什么?例如,我可能希望有一个内部枚举,它将被用作封闭类的属性,然后根据该属性值返回实现相同接口的封闭类的两个不同属性之一,如此处

class Moo{
enum Blah {
Hey{
Awwable awwableMe() {
return Moo.this.oe1;}
}, Ho{
Awwable awwableMe() {
return Moo.this.oe2;}
};
abstract Awwable awwableMe();
}

private Awwable oe1;

private Awwable oe2;

private Blah smth;

void Awwable theSomeMethod() {
return smth.awwableMe(); //or any other code that uses smth.awwableMe();
}
}

但是我无法编写这样的代码,因为我无法引用Moo.this.oe1oe2,因为它们处于非静态上下文中,而且我在其中。

1 个答案:

答案 0 :(得分:2)

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

来自docs

  

<强>讨论

     

可以调用在这些类主体中声明的实例方法   只有当它们覆盖可访问时才在封闭的枚举类型之外   封闭枚举类型中的方法。

     

枚举类型(第8.9节)不得声明为抽象;这样做会导致   在编译时错误。这是枚举类型E的编译时错误   除非E有一个或多个枚举,否则将抽象方法m作为成员   常量,以及所有E的枚举常量都有类主体   提供m的具体实现。这是一个编译时错误   用于声明抽象方法的枚举常量的类体。

     

枚举类型是隐式最终的,除非它包含至少一个枚举   具有类体的常数。无论如何,它是一个编译时   显式声明枚举类型为final的错误。

     

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

另外this

  

枚举类型除了枚举之外没有其他实例   常量。尝试显式是一个编译时错误   实例化枚举类型(§15.9.1)。