日光之下,并无新事。
——《圣经》
枚举和注解都是在Java1.5中引入的,虽然它们是后起之秀,但其功效不可小觑,枚举改变了常量的声明方式,注解耦合了数据和代码。
枚举的优点主要表现在:
1、枚举常量更简单
2、枚举常量属于稳态型
3、枚举具有内置方法
4、枚举可以自定义方法
在项目开发中,推荐使用枚举常量代替接口常量或类常量。
枚举描述,它的含义是通过枚举的构造函数,声明每个枚举项(枚举的实例)必须具有的属性和行为,是对枚举项的描述或补充,目的是使枚举项表述的意义更加清晰准确。
在枚举定义中为每个枚举项定义描述,特别是在大规模的项目开发中,大量的常量项定义使用枚举项描述比在接口常量或类常量中增加注释的方式友好得多,简洁得多。
枚举排序值ordinal从0、1、2……依次递增的,没有重号,没有跳号。
枚举与switch配合使用时,首先需要判断null值,因为switch通过枚举项执行ordinal方法计算出传入的枚举变量的排序值,然后与枚举常量的每个排序值进行对比的。
枚举实现工厂方法模式有两种方法:
1、枚举非静态方法实现工厂方法模式
enum CarFactory {
// 定义工厂类能生产的汽车类型
FordCar, BuickCar;
// 生产汽车
public Car create() {
switch (this) {
case FordCar:
return new FordCar();
case BuickCar:
return new BuickCar();
default:
throw new AssertionError("无效参数");
}
}
}
2、通过抽象方法生成产品
enum CarFactory {
FordCar {
public Car create() {
return new FordCar();
}
},
BuickCar {
public Car create() {
return new BuickCar();
}
};
// 抽象生产方法
public abstract Car create();
}
使用枚举类型的工厂方法模式有三个优点:
1、避免错误调用的发生
2、性能好,使用便捷
3、降低类间耦合
迪米特原则,最少知识原则:一个对象应该对其他对象有最少的了解。
当枚举项数量小于等于64时,创建一个RegularEnumSet实例对象,大于64时则创建一个JumboEnumSet实例对象。Java把一个不多于64个枚举项的枚举映射到了一个long类型的变量上,long类型也是64位的,因此RegularEnumSet类型只能负责枚举项数量不大于64的枚举。JumboEnumSet类把枚举项按照64个元素一组拆分成了多组,每组都映射到一个long类型的数字上。
枚举项数量不要超过64,否则建议拆分。