effective 第34條 用enum代替int常量

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);
        }
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章