为什么 Java 枚举不能是最终的?

2022-09-01 12:29:47
public interface Proposal  {  
    public static final enum STATUS { 
        NEW ,
        START ,
        CONTINUE ,
        SENTTOCLIENT
    }; 
}

Java 不允许枚举位于接口内,但缺省情况下,接口内的每个数据成员都是 。任何人都可以澄清这一点吗?finalpublic static final


答案 1

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

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


答案 2

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

此外,根据 JLS 第 8.9 节,没有实例具有自己的类体的枚举是隐式最终的。