2、遇到多個構造引數的時候需要考慮使用構建器(effective java)
考慮多個構造引數
一個類的構造引數很多,但是你不是每次構造都用上所有的引數的時候怎麼辦
傳統的使用重疊建構函式的寫法
public class NutritionFacts {
private final int servingSize; // (mL) required
private final int servings; // (per container) required
private final int calories; // optional
private final int fat; // (g) optional
private final int sodium; // (mg) optional
private final int carbohydrate; // (g) optional
//定義了多個建構函式
//順序都是往上呼叫的
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat,
int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat,
int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
public static void main(String[] args) {
NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);
}
}
這種寫法很蠢,引數越多越不好,第二種解決方法:
採用javabean:
//就設定你要的引數
public class NutritionFacts {
// Parameters initialized to default values (if any)
private int servingSize = -1; // Required; no default value
private int servings = -1; // " " " "
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public NutritionFacts() {
}
// Setters
public void setServingSize(int val) {
servingSize = val;
}
public void setServings(int val) {
servings = val;
}
public void setCalories(int val) {
calories = val;
}
public void setFat(int val) {
fat = val;
}
public void setSodium(int val) {
sodium = val;
}
public void setCarbohydrate(int val) {
carbohydrate = val;
}
public static void main(String[] args) {
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
}
}
缺點:
在構造過程中javabean可能處於不一致的狀態
javabean模式阻止了把類做成不可變的可能(需要額外的努力來保證執行緒安全)
採用Builder模式
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
//一個內部類
//以後維護的時候,新增新引數的時候也很方便
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
//建構函式需要傳builder
//可以使用單個builder構建多個物件
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
public static void main(String[] args) {
//具有安全性和可讀性
//build的時候才會驗證引數是否正確
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
.calories(100).sodium(35).carbohydrate(27).build();
}
}
相關文章
- 遇到多個構造器引數時考慮使用構建器(Effective Java )Java
- effective java 第2條:遇到多個構造器引數時要考慮用構造器Java
- (譯)Effective Kotlin系列之遇到多個構造器引數要考慮使用構建器(二)Kotlin
- (譯)Effective Kotlin系列之考慮使用靜態工廠方法替代構造器(一)Kotlin
- [翻譯]Effective Java in Kotlin:1. 考慮用靜態工廠方法而不是構造器JavaKotlin
- Effective Java - 靜態方法與構造器Java
- 構建一個 Javascript 多維陣列構造器JavaScript陣列
- 【lombok】@NoArgsConstructor/@RequirArgsConstructor/@AllArgsConstructor - 生成無參構造器,指定引數構造器或包含所有引數的構造器LombokStructUI
- Effective Java - 構造器私有、列舉和單例Java單例
- goldengate 中使用batchsql引數需要額外考慮的地方GoBATSQL
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- 網站在架構時要考慮的事情網站架構
- 什麼時候可以考慮使用MySQL MEMORY引擎MySql
- java——繼承遇到構造方法Java繼承構造方法
- 系統架構時考慮效能要素架構
- java構造器Java
- Java--構造器和構造方法Java構造方法
- js Date()建構函式引數需要注意一個問題JS函式
- 為何jquery例項化的時候不需要new 一個建構函式jQuery函式
- 【知識分享】多ip伺服器的租用需要考慮哪些伺服器
- 論資料倉儲架構前需要考慮的問題架構
- 重構模式(三)---- 應用 Refactoring 需要考慮的問題模式
- Java構造器 小白版Java
- 什麼時候考慮使用無程式碼開發平臺
- MongoDB複製集什麼時候考慮使用Shared Cluster?MongoDB
- Mysql主從架構搭建的時候遇到的問題MySql架構
- 《Effective C++》第2章 構造/析構/賦值運算(2)-讀書筆記C++賦值筆記
- 系統整合銀行卡識別API需要考慮哪些引數?API
- Java 中使用記憶體對映檔案需要考慮的 10 個問題Java記憶體
- 10g升級至11g需要考慮的引數優化優化
- Java構建器(Builder)JavaUI
- 什麼是 Java 構造器?Java
- 規劃新的企業架構時必須考慮的要素架構
- 建設智慧城市,需要從哪幾方面考慮?
- 在你重新設計網頁的時候考慮好使用者體驗網頁
- ORACLE 25個需要深思熟慮重要的初始化引數Oracle
- 規劃企業新IT架構時必須考慮要素架構
- MongoDB何時考慮使用分片MongoDB