Java 枚举类型
Peng's Blog 只记录和技术相关的东西

Java 枚举类型

2017-08-29

内容整理自《Java编程思想》第四版、第19章 枚举类型

关于枚举类:数目固定,类型和值不会变的情况一般用枚举类。就比如星期一 ~ 星期天这种。

基本enum特性

调用enum的values()方法,可以遍历enum实例。这个方法返回enum实例的数组,并且顺序是严格按照声明时候的顺序。

可以用 == 来比较枚举实例,编译器会自动为你提供equals()方法和hashCode()方法。

Enum还实现了Comparable接口,所以具有compareTo()方法,同时,它还实现了Serializable接口。

向enum中添加新方法

除了不能被继承之外,基本上可以将enum看做一个常规的类。也就是说,我们可以向enum中添加方法,连main方法都可以有。

覆盖enum的方法

主要就是覆盖里面的toString()方法,然后按照我们想要的实现来输出结果。

switch语句中的enum

一般情况下switch的case里面是整数类型(Java7之后支持String类型),所以说在switch中使用enum,是enum提供的一项非常便利的功能。

values()的神秘之处

这里提到了类型擦除,本身没有了,是由编译器自己插入的。

实现,而非继承

因为所有的enum都继承自java.lang.Enum类,而且Java不支持多重继承,所以你的enum类不能再继承其它类的。这时候就需要使用接口了,来实现接口里面的方法。

使用接口组织枚举

对于enum而言,实现接口是使其子类化的唯一方法。

使用EnumSet代替标志

JDK1.5引入的,是为了通过enum创建一种替代品,以代替传统的基于int的“位标志”,比如某种“开/关”信息等。

使用EnumMap

是一种特殊的Map,它要求其中的key必须来自一个enum。由于enum本身的限制,所以EnumMap在内部可以由数组实现。

常量相关的方法

这里面的状态机十分重要。

简单的说就是enum的每个item里面可以写一些自己的方法之类的。

使用enum的责任链模式

责任链模式:程序员以多种不同的方式来解决一个问题,然后将它们连接到一起。当一个请求到来时,它遍历这个链,直到链中的某个解决方法能够处理该请求。

使用enum的状态机

枚举类型非常适合用来创建状态机。一个状态机可以具有有限个特定的状态,它通常根据输入,从一个状态转移到下一个状态。

多路分发

这个比较复杂,demo里面实现了剪刀石头布。简单的说就是支持动态绑定多种类型,实现多路分发。


Comments

评论功能暂停使用,如需跟作者讨论请联系底部的GitHub