java基础 您所在的位置:网站首页 java中的Enum的父类 java基础

java基础

2024-04-20 18:01| 来源: 网络整理| 查看: 265

参考:重新认识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 实验室设备网 版权所有