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

類有多個可選參數的解決方案:程序員

1. 重疊構造器模式可行,可是當有許多參數的時候,客戶端代碼會很難編寫,而且仍然較難以閱讀。安全

2. JavaBeans模式,調用一個無參構造器來創造對象,而後調用setter方法來設置每一個必要的參數,以及每一個相關的可選參數。ui

缺點:構造過程被分到了幾個調用中,在構造過程當中JavaBean可能處於不一致的狀態。阻止了把類作成不可變的可能,須要程序員確保線程安全。this

3. Builder模式,模擬了具名的可選參數。spa

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

多參數時候易寫、易讀線程

構造過程一致code

建立構建器有開銷


 

 

 

 

 

// 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破壞了編譯時的異常檢查。對象

相關文章
相關標籤/搜索