構(gòu)造方法有個(gè)問題,就是不太好擴(kuò)展到大量的可選參數(shù)。ITEM1中提到的靜態(tài)工廠方法也有這個(gè)問題。
這個(gè)item講的就是如何選擇構(gòu)造器。
1. Telescoping constructor(重疊構(gòu)造器)
就是常見的Android的ViewGroup
源碼中的那種危彩,一環(huán)套一環(huán)的,要自定義一個(gè)自定義控件就要復(fù)寫三個(gè)構(gòu)造函數(shù)泳桦。比如LinearLayout:
public LinearLayout(Context context) {
this(context, null);
}
public LinearLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public LinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
這種優(yōu)點(diǎn)是你可以只賦一個(gè)參數(shù)的值汤徽,缺點(diǎn)是有很多參數(shù)的話比如七八個(gè),還是得挨個(gè)寫灸撰,容易亂谒府。于是有第二種方法拼坎。
2. JavaBeans
只提供一個(gè)無參構(gòu)造函數(shù)。剩下的參數(shù)全用setter和getter來添加和獲取完疫。
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
缺點(diǎn)我不太理解泰鸡。書上大致是說會(huì)導(dǎo)致線程不安全。如下:
3. Builder
這個(gè)模式之前寫SimpleBottomNavigation的時(shí)候也用到過壳鹤,但沒有寫一個(gè)靜態(tài)的builder內(nèi)部類盛龄,當(dāng)時(shí)只是模仿的,覺得是很巧妙芳誓,每次設(shè)置一個(gè)屬性之后又返回類的instance余舶,可以自由追加;但并沒有體會(huì)到什么好處兆沙。Android的Dialog也有類似的Builder。
書中還是用了可樂的例子:
// Builder Pattern
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);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
現(xiàn)在這樣新建一個(gè)client:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).sodium(35).carbohydrate(27).build();
這就是Builder模式莉掂。
特點(diǎn)是:
- 等待所有的參數(shù)驗(yàn)證通過才會(huì)build()對(duì)象葛圃。線程安全。
- 靈活加參數(shù)憎妙,易讀库正。
- 寫起來略冗長(zhǎng),適合參數(shù)多的時(shí)候用厘唾。
另外
昨天我設(shè)想的是每天花一小時(shí)左右學(xué)習(xí)《Effective Java》內(nèi)容褥符,但是感覺時(shí)間有點(diǎn)捉襟見肘的,很多東西理解得不夠深抚垃,也沒很多時(shí)間去探究喷楣,加上本身項(xiàng)目經(jīng)驗(yàn)也不多,對(duì)Java的理解也不夠深鹤树。但是由于還有其他事情铣焊,所以目前也只能如此,不過這樣學(xué)習(xí)一遍也是有好處罕伯,比如之前都不知道LinearLayout里面那種構(gòu)造方法叫telescoping constructor曲伊;所以這樣了解一番以后遇到了也可以深入學(xué)習(xí)。以上追他。
22:15 pm
14/02/2017