若没有任何实例包含Class Body 则enum被隐式声明为final
本文参考
今天在Java Language Specification上偶然看到一条关于枚举的语法特点说明
An enum declaration is implicitly final unless it contains at least one enum constant that has a class body
不是很理解此处Class Body的所指,查阅了一些关于Java enum的语法介绍和stack overflow上的回答,对这句话有了一定的理解
https://stackoverflow.com/questions/9891613/why-cant-a-java-enum-be-final
不含Class Body的enum声明
public enum Color1 {
RED("红色"),
GREEN("绿色"),
BLUE("蓝色");
private String description;
Color(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
不含Class Body的反编译结果
public final class Color1 extends Enum<Color1> {
public static final /* enum */ Color1 RED = new Color1("RED", 0, "\u7ea2\u8272");
public static final /* enum */ Color1 GREEN = new Color1("GREEN", 1, "\u7eff\u8272");
public static final /* enum */ Color1 BLUE = new Color1("BLUE", 2, "\u84dd\u8272");
private String description;
private static final /* synthetic */ Color1[] $VALUES;
public static Color1[] values() {
return (Color1[])$VALUES.clone();
}
public static Color1 valueOf(String name) {
return Enum.valueOf(Color1.class, name);
}
private Color1(String string, int n, String description) {
super(string, n);
this.description = description;
}
public String getDescription() {
return this.description;
}
static {
$VALUES = new Color1[]{RED, GREEN, BLUE};
}
}
含Class Body的enum声明
这个例子中无法体现"至少有一个实例包含Class Body"的语法特点,但是后期验证确实如此,有兴趣可以改下代码自行尝试
public enum Color2 {
RED {
@Override
public String getDescription() {
return "红色";
}
},
GREEN {
@Override
public String getDescription() {
return "绿色";
}
},
BLUE {
@Override
public String getDescription() {
return "蓝色";
}
};
public abstract String getDescription();
}
含Class Body的反编译结果
public abstract class Color2 extends Enum<Color2> {
public static final /* enum */ Color2 RED = new /* Unavailable Anonymous Inner Class!! */;
public static final /* enum */ Color2 GREEN = new /* Unavailable Anonymous Inner Class!! */;
public static final /* enum */ Color2 BLUE = new /* Unavailable Anonymous Inner Class!! */;
private static final /* synthetic */ Color2[] $VALUES;
public static Color2[] values() {
return (Color2[])$VALUES.clone();
}
public static Color2 valueOf(String name) {
return Enum.valueOf(Color2.class, name);
}
private Color2(String string, int n) {
super(string, n);
}
public abstract String getDescription();
/* synthetic */ Color2(String x0, int x1, 1 x2) {
this(x0, x1);
}
static {
$VALUES = new Color2[]{RED, GREEN, BLUE};
}
}
结论
enum实际上是一种特殊的class声明,enum实例(如上面代码示例中的RED、GREEN和BLUE)都被隐式地声明为public static final
当enum实例包含Class Body时,这种写法实际上生成了一个继承enum的特殊的内部类,所以enum声明不能够是final(声明为final的类无法被继承)
另外一个注意点,编译器不一定为enum声明隐式地添加public修饰符,若enum声明被包含在某个接口或类内,Java接口在编译时会自动为enum类型加上public static修饰符,而Java类在编译时会自动为 enum 类型加上static修饰符,具体可以参考这篇文章:
https://www.cnblogs.com/jingmoxukong/p/6098351.html
若没有任何实例包含Class Body 则enum被隐式声明为final的更多相关文章
- 构造函数、原型对象prototype、实例、隐式原型__proto__的理解
(欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原 ...
- JSP--JSP语法--指令--include(动态包含/静态包含)--九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构
一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1. JSP模板元素:JSP中HT ...
- PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作
之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下. 一.隐式转换 二进制算术运算符的隐式类型转换规则(http://php.net/m ...
- 从头认识java-13.9 隐式和显示的创建类型实例
对于上一章节擦除引起的问题与解决的方法有读者提出过于简单.这里解释一下:由于笔者本身也遇不到对应的问题.仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见, ...
- C#托管堆对象实例包含什么
每个托管堆上的对象实例除了包含本身的值外,还包括:○ Type Object Ponter: 指向Type对象实例.如果是同类型的对象实例,就指向同一个Type对象实例.○ Sync Block In ...
- JavaScript调用后台的三种方法实例(包含两种Ajax)
方法一:直接使用<%=%>调用(ASPX页面) 前台JS,代码如下: <script type="text/javascript"> var methodS ...
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...
- 数据库查询实例(包含所有where条件例子)
查询指定列 [例1] 查询全体学生的学号与姓名. SELECT Sno,Sname FROM Student: [例2] 查询全体学生的姓名.学号.所在系. SELECT Sname,Sno,Sdep ...
- KindEditor 4.1.11最新版 网站实例 包含使用方法 下载地址
KindEditor是非常好的富媒体文本编辑系统,短小精悍,可惜网上找到的都是有各种问题!一怒之下,我自己进行了修改和配置,搞成了一个网站示例.下载解压后,可以直接运行!!完全无问题.! Kinded ...
随机推荐
- EasyUI Datagrid 数据网格 点击选中行 再次单击取消选中行
适用于jquery-easyui-1.9.15版本: 在项目中全局搜索: opts.singleSelect==true 或者在jquery.easyui.min.js中搜索: opts.single ...
- windows消息机制框架原理【简单版本】
windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g).一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线 ...
- 【C# 线程】数据槽 LocalDataStoreSlot简称DataSlot
背景 为了确保在线程中声明特定类型的变量,在每个线程中的值都是唯一的,不受到其他线程对该变量读写的影响.也就是俗称的线程本地存储 (TLS),可用于存储对线程和应用程序域唯一的数据. 例如:主线程中声 ...
- Eclipse Debug 调试步骤及注意事项
debug方法 第一步:打开java代码文件,在左侧双击鼠标设置断点,或者在左侧右键点击Toggle Breakpoint 第二步:点击eclipse上方的"蜘蛛"按钮,点击deb ...
- Spring AOP之3w的配置
1.3w是什么? ■ what.where.when 或者 what.when.where 2.what.where.when[通用] (1)what:增强器-bean[配置一个bean对象] (2) ...
- 爬虫之Beautfulsoup模块及新闻爬取操作
今日内容概要 IP代理池的概念及使用 requests其他方法补充 Beautifulsoup模块 避免你自己写正则表达式 利用该模块爬取京东的商品信息 今日内容详细 IP代理池的概念及使用 1.有很 ...
- SpringCloudStream(RabbitMQ&Kafka)&Spring-Kafka配置使用
目录 是什么 解决问题 使用方式 创建生产者项目 pom yml 生产消息方法 接口 实现 创建消费者项目 pom yml 接收消息方法 重复消费 消费者yml 持久化 消费者负载个性配置(预拉取) ...
- Activemq持久化之kahadb特性
介绍数据的持久化是很多系统都会涉及到的一个问题,尤其是redis,activemq这些数据主要是存储在内存中的.既然存在内存中,就会面临宕机时数据丢失的风险.这一问题的解决方案就是通过某种方式将数据写 ...
- metinfo 6.0 任意文件读取漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.点击新建项目按钮,弹出对画框中选择(C:\ ...
- sql高级手工注入
非常重要:首先在网站找到管理入口,否则,呵呵就算有用户名和密码,找不到入口,也是白玩.. 注入时,注意通过改变大小写.编码.转换等方式躲过系统检查,顺利执行语句!!! (一)数字型注入 正常步骤: 1 ...