为什么Java enum不能是最终的?

Zun*_*med 22 java enums final

public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}
Run Code Online (Sandbox Code Playgroud)

Java不允许枚举final在接口内部,但默认情况下,接口内的每个数据成员都是public static final.任何人都可以澄清一下吗?

Str*_*ior 32

Java不允许您创建扩展enum类型的类.因此,枚举本身总是最终的,因此使用final关键字是多余的.

当然,从某种意义上说,enums不是最终的,因为你可以为枚举描述符中的每个字段定义一个匿名子类.但是使用final关键字来防止这些类型的描述没有多大意义,因为人们必须在同一个.java文件中创建这些子类,任何有权这样做的人都可以轻松地删除final关键字.在其他一些软件包中没有人扩展你的枚举的风险.

  • @EugeneKuleshov:`Enum`类是抽象的,因为你必须能够扩展它.但扩展它的实际`enum'被编译器定义为`final`类.请参见http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 (6认同)
  • 然而,没有"枚举"类型可以被子类化. (4认同)
  • 换句话说,`java.lang.Enum`是抽象的,因为用`enum`关键字声明的所有枚举都由编译器转换为`java.lang.Enum`类的子类. (3认同)

Eug*_*hov 27

枚举不能是最终的,因为编译器将为程序员明确定义实现的每个枚举条目生成子类.

此外,JLS第8.9节中没有实例拥有自己的类主体的枚举是隐式最终的.


小智 7

两件事情:

  1. 枚举是java.lang.Enum的最终子类
  2. 如果枚举是类的成员,则它是隐式静态的