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

时间:2012-03-27 14:29:33

标签: java enums final

public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}

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

4 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:26)

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

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

答案 2 :(得分:7)

两件事:

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

答案 3 :(得分:2)

宣布枚举最终没有意义。类的最终意味着它们不能被继承。但是,默认情况下不能继承枚举(即它们是最终的)。

最后一件事仅对变量有效。但是,您应该将枚举更像数据类型而不是变量。