博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java enum类_Java面向对象之枚举——enum
阅读量:4356 次
发布时间:2019-06-07

本文共 1780 字,大约阅读时间需要 5 分钟。

069155c5c52191489294e07a4c6a676e.pngJava面向对象之枚举——enum

引出枚举

首先来考虑这样一个需求:判断一个员工(Employee)在一周的哪一天休息。

解决方案:定义一个类Weekday来表示周1到周日,在类中分别使用7个常量来表示周1到周日,代码如下:

400e71cb3fe6f50426439643afb9151b.png类Employee

9e3de21d579a86df9a2d8ca8bfd7ed14.png类Weekday

运行案例:

0b5d3fc6d098e552f771f4045d9e0e0a.png运行案例

此时,上述的代码示例很清楚的解决了业务需求,引入的Weekday类很好的表示了从周一到周日。但是也存在一些问题,因为在Employee中的restDay的类型是int类型,我们依然可以随意设置irestDay的值,代码并不健壮,依然没有解决数据类型不安全的问题,任然有改进的空间。

为了解决数据类型不安全的问题的问题,可以在WeekDay中引入私有构造器,防止WeekDay被除自身以外的其他对象实例化,然后可以将WeekDay作为休息日的数据类型,很好的解决了数据类型不安全的问题,同时,也可以将休息日的个数固定下来。改造后的代码如下:

91e08854d3d3faa550acc0d4cf6d0092.png类Employee

178860c672b6251ada6ce7046c127df5.png类WeekDay

运行案例:

b0aa9fedfe8f5bd17b843526ab3feff7.png运行案例

到这里,不仅业务需求明确,数据类型安全的问题也解决了。

Java 枚举

从Java 5 开始,提供了一种新的数据类型,枚举。和接口一样,枚举是一个特殊的类,其实质上就是数量固定的多个常量对象的集合。枚举主要用来表示固定的事务类型。

枚举语法定义格式:常量之间使用英文状态下的“,”分隔,最后一个常量之后必须要用“;”结尾。

e19d5daec9793631d60e5c97eb874132.png枚举语法

在上述案例中的WeekDay类用枚举来重写就是这样的:

enum WeekDay {MONDAY,TUESDAY,WEDNESDAY,THURSDAY ,FRIDAY,SATURDAY,SUNDAY;}

在开发中自定义的枚举类,在底层都是直接继承于java.lang.Enum类的,Enum类是所有枚举的父类。看下图会有一个更直观的感受:

1afdc5e7ca018343cf9ebb40f2df33c4.png底层的枚举类

枚举特点:

枚举的直接父类是java.lang.Enum,但和java.lang.Object一样,枚举都不会显式地继承Enum。枚举就相当于一个类,可以定义构造方法、成员变量、普通方法和抽象方法。拥有默认的私有构造方法,即使不写访问权限也是private,因为枚举在底层没有无参数构造器的。枚举中的每个常量都是全局的,每个常量都是一个实例,且因为常量个数是固定的有限个的,所以实例个数也是固定的,且枚举类不能使用new关键字。枚举实例必须位于枚举结构体中的最开始部分,枚举实例列表的最后必须要有分号与其他成员相分隔。枚举实例后有花括号时,该实例是枚举类的匿名内部类对象。

枚举的使用:

1.枚举中的常量都是全局公共的静态常量,可以直接使用枚举类名调用。

Weekday day = Weekday.SATURDAY;2.因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法。

String name = 枚举对象.name(); // 返回枚举对象的常量名称int ordinal = 枚举对象.ordinal(); // 返回枚举对象的序号,从0开始String str = 枚举对象.toString(); // 返回 枚举对象的常量名称3.JVM为枚举类生成的静态方法:

1.枚举类型[] values();Weekday[] ws = Weekday.values();:返回当前枚举类型所有的常量,使用一个数组封装起来。2.枚举类型 valueof(String name);Weekday day = Weekday.valueOf("MONDAY"); // 把一个指定名称字符串转换为当前枚举类中同名的常量.4.从Java 5开始switch也支持操作枚举类型。Java switch的使用细节和使用注意

虽然switch只支持int类型,但因为支持枚举时在底层使用的枚举常量的ordinal,而ordinal的类型依然是int类型。所以也可以说switch是在间接支持枚举。

a77fe62e702b7b303b7c1e04efdd6d39.pngswitch支持枚举

枚举的单例模式

在<>书中提到,建议使用枚举类做单例模式,能够很好的保护代码隐私,即使使用反射也不能创建对象。通过以下的两种代码对比,能够很直观的展现枚举实现的单例模式:

b62edb6e8ca66ffea6dc46eaa6e655be.png未使用枚举的单例模式

03411f2b47871262c937112b635cefb5.png使用枚举的单例模式

完结。

转载地址:http://plxys.baihongyu.com/

你可能感兴趣的文章
JavaScript原生错误及检测
查看>>
(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()
查看>>
为什么写作
查看>>
整数子数组求最大和添加验证
查看>>
使用kubeadm安装Kubernetes
查看>>
Principal Component Analysis 主元分析
查看>>
linux分割字符串操作
查看>>
linux下安装Mongodb
查看>>
Page.RegisterStartupScript和Response.Write的区别。
查看>>
hdu4348区间更新的主席树+标记永久化
查看>>
ZOJ 2532 Internship
查看>>
HDU 3452 Bonsai
查看>>
[Erlang12] Mnesia分布式应用
查看>>
图的遍历 | 1013 连通块块数
查看>>
Kinect 开发 —— 进阶指引(上)
查看>>
python学习笔记(六)time、datetime、hashlib模块
查看>>
uva489(需要考虑周全)
查看>>
C-关键字(二)
查看>>
排序笔记
查看>>
下载360doc.com里的文章
查看>>