0013JDK源码分析之枚举

Posted Java框架源码分析

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0013JDK源码分析之枚举相关的知识,希望对你有一定的参考价值。

本文将介绍java中的枚举。枚举是JDK1.5新加的特性,枚举的出现拯救了使用接口或抽象类定义常量的缺陷,同时,枚举也提供了很多操作常量的方法,比如遍历常量。其次,枚举中还可以自定义属性和方法,十分方便。

本文大纲:

1、接口或抽象类定义常量

2、枚举定义常量

3、枚举自定义属性与方法

4、枚举的常用方法

5、枚举的原理

6、总结

一、接口或抽象类定义常量

在枚举还没有出现之前,定义常量的方式有三种,一是接口的方式,二是抽象类的方式,最后一个是使用类(俗称常量类)的方式。那么我们就来看一下之前的方式。假如我们需要定义用户状态码,包括用户名错误,密码错误,用户不存在等等。

1、接口定义常量

【0013】JDK源码分析之枚举

2、抽象类定义常量

【0013】JDK源码分析之枚举

3、常量类

【0013】JDK源码分析之枚举

看完了这三种方式,你觉得哪一种相对好一点?首先接口和抽象类是差不多的,都是为了表达其不可实例化的意图,但是接口和抽象类本来就是让子类继承和实例化的,很明显这两种方式与面向对象思想相违背。那么看一下常量类,声明为final,表明不能被继承,然后私有构造器,表明不能被实例化,相对好一点,但是每个常量都要写前面这么一段(public static final),感觉重复太多,有没有更加简洁的方法呢?答案是有的,那就是枚举,枚举是定义常量的最佳方式。

二、枚举定义常量

我们先看一下使用枚举如何实现用户状态码的定义。如下图所示。enum是关键字,定义枚举时使用,编译器会自动继承Enum类,Enum是所有枚举类的公共基类,该类实现了Comparable和Serializable接口,所以所有枚举都支持序列化和排序。枚举常量不需要在前面加public static final,默认就是。很明显代码更加简洁了,相对于上面的三种方式。其次,每个枚举常量都有一个序数,类似0,1,2,3,用于排序,所以不用我们自己定义。

【0013】JDK源码分析之枚举

三、枚举自定义属性与方法

在枚举中也可以自定义属性和方法,和类差不多,比如我们定义一个文件类型码,每种文件类型都有一个code。同时重写了toString方法,打印对象引用时显示文件类型码的code。枚举常量的属性必须在构造器中出现,因为枚举常量是单例,初始化时调用构造器创建。同时,枚举也是实现单例模式的很有的方式。

【0013】JDK源码分析之枚举

四、枚举的常用方法

1、遍历枚举中的所有常量values()方法

【0013】JDK源码分析之枚举

2、枚举常量的名称name()方法

【0013】JDK源码分析之枚举

3、比较两个枚举常量equals()方法,如果你要比较某个枚举常量是否与其对应的类型码相等,你可以重载equals()方法,比如:equals(String code)

【0013】JDK源码分析之枚举

4、在switch中的使用

五、枚举的原理

枚举其实是一个public final class类,继承了Enum类,枚举中的常量都是public static final的,我们反编译一下UserState类看一下效果。

六、总结

简单总结一下,本文主要介绍了枚举的应用,替代接口和抽象类的丑陋方式,是常量类的完美表现,同时,介绍了枚举在开发中经常使用到的方法,以及如何自定义属性和方法,最后介绍枚举的实现原理。当你要编写一组常量的时候,你可以考虑枚举了。

感谢您的阅读,谢谢!

以上是关于0013JDK源码分析之枚举的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.8源码分析03之idea搭建源码阅读环境

JDK1.8源码分析之HashMap

JDK 源码分析之 String 相关

JDK1.8 源码分析之HashMap

JDK1.8源码分析之TreeMap

JDK1.8源码分析02之阅读源码顺序