Java枚举(Enum)类型原理探求
Enum枚举类型Enum的全写是Enumeration , 这个词的翻译是列举、逐条陈述、细目 。 在程序语言中 , 枚举类型是一种特殊的数据类型(常用的数据类型比如字符串、整型) , 这种数据类型的变量值限定在固定的范围 ,比如季节只有春夏秋冬 , 月份是12个 。
Java中的枚举枚举前时代在Java语言中 ,枚举类型从JDK1.5才开始提供 。 在这之前使用接口静态常量来实现相关功能(也可以是类静态常量) , 以季节为例:
在不使用枚举类之前 , 一般使用接口静态常量实现 。 比如:
public interface Season {public static final int SPRING = 1;public static final int SUMMER = 2;public static final int AUTUMN = 3;public static final int WINTER = 4;}
使用JUnit使用测试如下:
@Testpublic void noEnum() {int i = 1;Assert.assertTrue(Season.SPRING==i);}
使用接口静态常量的方式比较难限定变量的范围 , 而且定义繁琐 , 功能也很有限 , 于是在Java 1.5 中定义了一个枚举类型:java.lang.Enum 。
Java枚举的定义类似类(class)和接口(interface)的定义 , Java提供enum关键字用来定义枚举类 , 在IDEA中创建枚举类的菜单如下:
同样定义一个季节的枚举类 ,代码可以简洁如下:
package cn.osxm.jcodef.func.base;public enum SeasonEnum {SPRING, SUMMER, AUTUMN, WINTER}
在枚举类中直接列出常量 , 常量遵循全部大写的规则 。 在上面的枚举类示例代码中 , SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成员 。
- 枚举成员默认是final、public、static (所以可以使用SeasonEnum.SPRING方式调用枚举成员)
- 每一个枚举类型成员都可以看作是枚举类的实例 (SeasonEnum.SPRING的类型也是SeasonEnum)
@Testpublic void enumBase() {SeasonEnum season = SeasonEnum.SPRING;Assert.assertTrue(season.equals(SeasonEnum.SPRING));}
Java 枚举类的特性Java枚举类的特性有:- 枚举可以实现接口 , 但不能继承接口 , 也不能被继承 。
- 枚举类是final的 , 所以不能继承 。
- 枚举类的构造方法是私有的
- 枚举成员是静态、final和public
- 枚举成员是枚举类的实例
Java枚举类实现的原理探求ava枚举类型的奥秘就在编译阶段 , 枚举类在编译后会生成了一个扩展java.lang.Enum的类 。 这个可以通过JDK自带的javap工具来反编译生成的.class文件 。 对上面的生成的SeasonEnum.class文件进行反编译 , 因为这个文件的包路径是cn\osxm\jcodef\func\base , 所以在命令行使用如下命令:
javap -p cn\osxm\jcodef\func\base\SeasonEnum.class
- -p参数的意思是反编译代码中包含私有的方法 ,p是private的意思 。
- 自定义的枚举类会自动继承java.lang.Enum类
- 每个成员变量都会被转换为 private static final的枚举类型的实例
- 自动添加private的构造函数 从反编译后的源码就不难理解Enum的特性了 。
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 程序员学英语第1天——JavaScript 程序测试的介绍1
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- 《深入理解Java虚拟机》:对象创建、布局和访问全过程
- java面试题整理
- Kotlin集合vs Kotlin序列与Java流
- Java安全之Javassist动态编程
- 推荐Java工程师必看,12个Hadoop领域的上手项目
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 整理:常见的Java开发框架有哪些,看过,就赶紧收藏吧