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[[email protected]]
*
*/
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);
}
}
}