java基础 | 您所在的位置:网站首页 › java中的Enum的父类 › java基础 |
参考:重新认识java(十) ---- Enum(枚举类) 一,缘由 在并发编程中,要注意对象的线程安全,其中的一种方法是让对象不可变,不可变的对象一定是线程安全的!但有时候做不到让对象不可变,那这时候就一定缩小对象域的可变范围,让对象状态时刻处于可控的状态下。 如果想要控制对象域状态,只用到基本类型和对象是不够的,比较好的方式是使用枚举,比如定义星期几,月份,性别等,这种方式不仅可以定义状态,还能让状态“可读”,一看到状态名字就知道是什么意思,另外,还有在switch中使用。 二,实现原理 枚举类可以使用关键字 enum 定义,其实这是一个语法糖,真实的代码如下图: 首先看类定义,可以很容易看出,枚举类是不可被扩展的,另外,枚举类还继承了Enum抽象类,后面将这个类。 再看域,域被定义为公有静态不可变的,所以直接通过枚举类直接访问,但是不可改变,并且域被定义为枚举类类型的,这就说明每个域都是枚举类的一个实例, 然后观察方法,valueOf是重写的父类的,values()是编译器自动加上的方法,那这两个方法有什么用那? values()用来返回一个实例数组,包含所有的枚举类的所有实例。 valueOf()根据字符串名字返回对应的实例,若没有则抛出异常。 其他方法在下面说Enum抽象类时说。 三,自定义构造器与方法 既然枚举类就是继承了Enum类的普通类,那么就能定义构造器和方法: 很简单,跟普通的类一样,每个域都在初始化时调用了构造方法。 注意!这里的构造器必须是私有的,不是的话编译器会报错,因为枚举类的初衷就是创建有限的实例,弄个公有构造器会让枚举类创建新的实例。 另外,每个实例还可以单独实现枚举类中的方法,可以将这种方式理解为继承重写,但只能在枚举类内部做这种事情! 四,java.lang.Enum类 这个抽象类就是枚举类实际继承的类,下面探究其真实面目 1,类定义 public abstract class Enum implements Comparable, Serializable可以看出,这个抽象类实现了Comparable与Serializable接口,所以枚举类能够自动实现序列化与比较操作。 2,域 ①,String name 这个域就是储存了每个枚举类实例的名字,我们打印枚举类实例时是调用的枚举类的toString()方法,而toString()方法是直接返回的name这个域 ②,int ordinal 这个储存了枚举类的下标,这个值和name值是在枚举类初始化时传入的,然后还有个与这个域同名的方法就是直接返回这个域,另外在比较方法compareTo()中也是直接比较的两个实例的ordinal域 3,方法 没啥高深的方法,列举一下吧: getDeclaringClass():返回子类或父类的Class对象protected Enum(String name, int ordinal):只能有子类调用的构造方法,需要传入name和下标,这个是有编译器自动执行的构造器。 clone():禁止clone,若是调用了,直接报运行时异常 equals():直接用双等号比较是不是同一个实例引用 hashCode():调用Object的hashCode()方法 两个防止违约序列化的两个私有函数 |
CopyRight 2018-2019 实验室设备网 版权所有 |