1.int常量示例:
public static final int APPLE_FUJI = 0;
public static final int ORANGE_NAVEL = 0;
这种方法称作int枚举模式,它存在很多不足。int枚举模式不具有类型安全新,也几乎没有描述性而言。例如你将apple传到orange中,编译器也不会发出警告,还会用==操作符对apple和orange进行比较,甚至更糟糕。所以java提供了枚举类型(enum type)。
int 枚举是编译时常量。
2.java的枚举本质上是int值。
3.java枚举类型的基本想法非常简单:这些类通过公有的静态final域为每个枚举常量导出一个实例。枚举类型没有可以访问的构造器,所以他是真正的final类。枚举类型是实例受控的,它们是单例的泛型化,本质上是单元素的枚举。
4.枚举天生就是不可变的,因此所有的域应该为final的。
5.特定于常量的方法实现:在枚举类中声明一个抽象的方法,并在特定于常量的类主体中,用具体的方法覆盖每个常量的抽象方法。
6.策略枚举:在一个枚举中 定义一个私有的嵌套枚举,并将这个策略枚举的实例传到外层枚举的构造器中。
7.总而言之,与int常量相比,枚举类型的优势不言而喻。枚举的可读性更好,也更加安全,功能更加强大。
package effectivejava;
/**
* 策略枚举示例(strategy enum):在一个枚举中 定义一个私有的嵌套枚举,并将这个策略枚举的实例传到外层枚举的构造器中。
*
* @author wangcaiyan[wang_cy1@suixingpay.com]
*
*/
public enum PayrollDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);
private final PayType payType;
private PayrollDay(PayType payType) {
this.payType = payType;
}
private PayrollDay() {
this(PayType.WEEKDAY); // default
}
int pay(int minsWorked, int payRate) {
return payType.pay(minsWorked, payRate);
}
// 策略枚举
private enum PayType {
WEEKDAY {
@Override
int overTimePay(int mins, int payRate) {
return mins <= MINS_PER_SHIFT ? 0 : (mins - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND {
@Override
int overTimePay(int mins, int payRate) {
return mins * payRate / 2;
}
};
abstract int overTimePay(int mins, int payRate);
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return basePay + overTimePay(minsWorked, payRate);
}
}
}