1. 程式人生 > >【讀書筆記 - Effective Java】02. 遇到多個構造器參數時要考慮用構建器

【讀書筆記 - Effective Java】02. 遇到多個構造器參數時要考慮用構建器

wid style ive tex 解決 相關 class javabeans stat

類有多個可選參數的解決方案:
1. 重疊構造器模式可行,但是當有許多參數的時候,客戶端代碼會很難編寫,並且仍然較難以閱讀。
2. JavaBeans模式,調用一個無參構造器來創造對象,然後調用setter方法來設置每個必要的參數,以及每個相關的可選參數。
缺點:構造過程被分到了幾個調用中,在構造過程中JavaBean可能處於不一致的狀態。阻止了把類做成不可變的可能,需要程序員確保線程安全。
3. Builder模式,模擬了具名的可選參數。

模式
重疊構造器 寫法最簡單 多參數時候難讀、難寫、難用
JavaBeans 創建實例簡單 構造過程可能不一致
Builder

多參數時候易寫、易讀

構造過程一致

創建構建器有開銷


// Builder模式示例
public class NutritionFacts {
    private final int servingSize; // 必選參數
    private final int servings; // 必選參數
    private final int fat; // 可選參數
    private final int sodium; // 可選參數
    
    public static class Builder {
        private final int
servingSize; private final int servings; private int fat = 0; private int sodium = 0; public Builder(int servingSize, int servings) { this.servingSize = servingSize; this.servings = servings; } public Builder fat(int
val) { fat = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } } private NutritionFacts(Builder builder) { servingSize = builder.servingSize; servings = builder.servings; fat = builder.fat; sodium = builder.sodium; } }
// 調用
NutritionFacts coca = new NutritionFacts.Builder(240, 8).fat(5).build();

Java中傳統的抽象工廠實現是Class對象,用newInstance方法充當build方法的一部分。然而newInstance方法總是企圖調用類的無參構造器,但是有的類沒有無參構造器,這時也不會收到編譯時錯誤。Class.newInstance破壞了編譯時的異常檢查。

【讀書筆記 - Effective Java】02. 遇到多個構造器參數時要考慮用構建器