八十三、推荐使用枚举定义常量
JLS(Java Language Specification,Java语言规范)提倡枚举项全部大写,字母之间用下划线分割。
枚举的优点主要表现在下列四个方面:
- 枚举常量更简单
- 枚举常量属于稳态型
- 枚举具有内置方法
- 枚举可以自定义方法
在项目开发中,推荐使用枚举常量代替接口常量和类常量。
八十四、使用构造函数协助描述枚举项
一般来说,我们经常使用的枚举项只有一个属性, 即排序号,其默认值是从0,1,2……但是除了排序号之外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举项(也就是枚举的实例)必须具有的属性和行为,这是对枚举项的描述和补充,目的是使枚举项表述的意义更加清晰准确。
推荐大家在枚举定义中为每一个枚举项定义描述,特别是在大规模的项目开发中,大量的常量项定义使用枚举项描述比在接口常量或类常量中增加注释的方式友好的多,简洁的多。
八十五、小心switch带来的空值异常
switch语句是先计算枚举变量的排序值,然后与枚举变量的每一个排序值进行对比,如果枚举变量是null, 就无法执行ordinal方法,于是就会报空指针异常。
八十六、在switch的default代码块中增加AssertionError错误
如果枚举项添加了一项,在switch语句中没有添加此项,编译虽不会出问题,但是运行期会发生非预期的错误。为了避免出现此类错误,建议在default后直接抛出一个AssertError错误,其含义就是“不要跑到这里,跑到这里就会出问题”。这样可以保证在增加一个枚举项的情况下,若其他代码未修改,运行期马上就会报错。
八十七、使用valueOf前必须进行校验
Enum类提供的方法有:hashCode、name、valueOf等。其中valueOf方法会把一个String类型的名称转变为枚举项,也就是在枚举项中查找出字面值与才参数相等的枚举项。
valueOf方法先通过反射从枚举类的常量声明中查找,若找到就直接返回,若找不到则抛出无效参数异常。valueOf的本意是保护枚编码中的枚举安全性,使其不产生空枚举对象,简化枚举操作,但是却引入了一个我们无法避免的IllegalArgumentException异常。有两个方法可以解决此问题:
- 使用try……catch捕捉异常。这是最直接也是最简单的方法。
- 扩展枚举类。通过增加一个contains方法来判断是否包含指定的枚举项。
八十八、用枚举实现工厂方法模式更简洁
工厂方法模式(Factory Method Pattern)是“创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到子类。”
枚举实现工厂方法模式有两种方法:
- 枚举非静态方法实现工厂方法模式
- 通过抽象方法生成产品
为什么要使用枚举类型的工厂方法模式呢?那是因为使用枚举类型的工厂方法模式有以下三个优点:
- 避免错误调用的发生
- 性能好,使用便捷
- 降低类间耦合