Effective Java學習筆記之二:遇到多個構造器參數考慮使用構建器

  • 解釋

有大量可選參數的類,應該怎麼編寫和實例化呢?有如下三種方法:

1、使用重疊構造器

public Rule2(int a) {
this.a = a;
}
public Rule2(int a,int b) {
this.a = a;
this.b = b;
}
public Rule2(int a,int b,int c) {
this.a = a;
this.b = b;
this.c = c;
}

2、使用setter方法

public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public void setC(int c) {
this.c = c;
}

3、使用Builder模式

public static class Builder {
private int a;
private int b;
private int c;
public Builder a(int a) {
this.a = a;
return this;
}
public Builder b(int b) {
this.b = b;
return this;
}
public Builder c(int c) {

this.c = c;
return this;
}
public Rule2 build() {
return new Rule2(this);
}
}

實例化方法如下:

 //使用重疊構造器的實例化
Rule2 rule21 = new Rule2(10, 20, 30);

//使用setter的實例化
Rule2 rule22 = new Rule2();
rule22.setA(10);
rule22.setB(20);
rule22.setC(30);

//使用Builder模式的實例化
Rule2 rule23 = new Rule2.Builder().a(10).b(20).c(30).build();
  • 優點1:避免重疊構造器的問題

當類有大量參數的時候,重疊構造器將會失控,代碼不易於閱讀和維護;

  • 優點2:避免setter的問題

在構造過程中Java Bean 可能處於不一致的狀態,是非線程安全的。

  • 優點3:適用於類層次結構

一句話,可以被繼承做成多層結構。

  • 缺點1:性能問題

為了創建對象,必須先創建它的構建器。雖然創建這個構建器的開銷在實踐中可能不那麼明顯但是在某些十分注重性能的情況下,可能就成問題了。

  • 缺點2:比重疊構造器更加冗長

Builder 模式比重疊構造器模式更加冗長,因此它只在有很多參數的時候才使用,比如4 個或者更多個參數。

  • 最佳實踐

在實際工作中,我們會把類分成控制類和實體類等,像這種有很多屬性的類通常會是實體類,比如DTO對象,通常用於映射數據庫中的表,在Spring框架下,實體類不會被注入。實體類會包含setter和getter方法,所以,實體類很少會出現使用Builder模式的場景,至於setter方法導致的非線程安全問題,通常在控制類中考慮,實體類不需要考慮。當控制類中出現多個屬性的場景,可以考慮採用這種規則。

Effective Java學習筆記之二:遇到多個構造器參數考慮使用構建器

專業從事軟件研發工作多年,在軟件設計、開發、測試、研發管理等領域裡經驗豐富,感興趣的朋友可以關注我的頭條號,相信一定會有所收穫。

如果有軟件研發方面的問題,可以諮詢我。

謝謝!


分享到:


相關文章: