ForCleanCode 為筆者讀書總結畅蹂,出于自身理解目的總結吭露!
一丶對象的創(chuàng)建和銷毀
(一) 靜態(tài)工廠方法替代構造器
1.靜態(tài)工廠方法的幾大優(yōu)勢:
(1) 靜態(tài)工廠方法與傳統(tǒng)構造器方法不同的第一大優(yōu)勢 ,他們有名稱:
sample:返回一個素數(shù)
public static int BigInteger.probablePrime(int, int, Random){}
(2)不必再每次調用它的時候都創(chuàng)建一個新的對象:
sample:重復利用 預先創(chuàng)建好的實例谦屑,如布爾b
/**
* 1 確保他是一個Singleton
* 2 可用 == 替代 equals,判斷相等 提升性能
* @param b
* @return
*/
public static Boolean valueOf(boolean b){
return b ? Boolean.TRUE:Boolean.FALSE;
}
(3)可以返回原返回類型的任何子類型的對象流妻,提高靈活性
sample: java.util.EnumSet 為例子
/**
* 1 如果他的元素<=64 return RegularEnumSet
* 2 否則 return JumboEnumSet
* 3 class RegularEnumSet<E extends Enum<E>> extends EnumSet<E> 都是他的子類
* 4 對客戶端不可見 根據(jù)參數(shù)返回適配類型 更加靈活
* @param elementType
* @param <E>
* @return
*/
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
(4) 在創(chuàng)建參數(shù)化類型實例的時候痘拆,使代碼變得更加簡潔:
sample:已實例化單個HashMap為例子:
/**
* 傳統(tǒng)寫法
* 缺點:如果HashMap參數(shù) 很多 特別冗長 卷拘,實例化起來寫長參數(shù) 會很麻煩
*/
Map<String,List<String>> mMap = new HashMap<String, List<String>>();
/**
* 靜態(tài)工廠方法
* 省下了手寫實例化后的參數(shù)
*/
Map<String,List<String>> mStaticMap = newInstance();
/**
* J神說 目前HashMap 并沒有工廠方法(可以放自己的工具類中)
* 在以后java版本中可能會看到
*
* @param <K>
* @param <V>
* @return
*/
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
2丶靜態(tài)工廠方法的缺點
(1)類如果不含有公有的或者受保護的構造器喊废,就不能被子類化
sample: 比如 Collections 和 Framework, 構造方法私有化 肯定就不能被實例化了。栗弟。污筷。。
(2)靜態(tài)工廠與其他靜態(tài)方法實際沒有任何區(qū)別乍赫。
sample:
比如你實例化一個TextView 他是通過構造器 實例化的瓣蛀,你找到對應的對象通過Ctrl+左鍵和容易定位
到 該對象所實例化的構造方法。
但是通過靜態(tài)工廠 返回給你的實例化對象雷厂,是如何實例化的很難找到惋增。
但是J神又說了 Javadoc總有一天會注意到這些靜態(tài)工廠方法的(但是目前 java8 還沒實現(xiàn) 嘻嘻嘻)
(二)遇到多個構造器參數(shù)時要考慮用構造器
靜態(tài)工廠和構造器有個共同的局限性:不能很好的擴展到大量的參數(shù)。
(1)從迭代構造器角度考慮:
sample:迭代構造器我們遇到了太多了改鲫,比如常見的自定義View
/**
* 根據(jù)傳入參數(shù)的數(shù)量挨個迭代诈皿,直到三個參數(shù)的構造器為止
* Created by zhaoyuanchao on 2018/4/21.
*/
public class SampleView extends View {
public SampleView(Context context) {
this(context, null);
}
public SampleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SampleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
缺點:
構造器調用通常需要許多你根本不想設置的參數(shù),但是由于構造器限制 不得不為他傳值像棘, 如果有10個參數(shù)那種構造器稽亏,就會很快失去控制 相當?shù)牟混`活。
(2)JavaBean模式考慮:
sample:可以很好的處理每個必要的可選參數(shù)缕题,創(chuàng)建實例容易
/**
* Created by zhaoyuanchao on 2018/4/21.
*/
public class SampleBean {
private String a;
private String b;
public SampleBean() {
}
public void setA(String a) {
this.a = a;
}
public void setB(String b) {
this.b = b;
}
}
缺點:
JavaBean 由于構造過程被分調到了 幾個方法中措左,所以無法通過構造器的有效參數(shù) 來保證該類的一致性。
線程不安全避除。
(3)Builder模式:
sample: 既能保證像構造器那樣的安全性怎披,也能保證像JavaBean那樣的可讀性。
public class NutritionFacts {
private final int a;
private final int b;
private final int c ;
private final int d;
private final int e;
private final int f;
public static class Builder{
// 如 a b 為必須傳入的值
private final int a;
private final int b;
// c d e f為非必須傳入的值
private int c = 0;
private int d = 0;
private int e = 0;
private int f = 0;
public Builder(int a , int b) {
this.a = a;
this.b = b;
}
public Builder setC(int val){
c = val;
//這里面為什么要為什么要return 自身呢? 為了方便鏈式調用復制 c d e f
return this;
}
public Builder setD(int val){
d = val;
return this;
}
public Builder setE(int val){
e = val;
return this;
}
public Builder setF(int val){
f = val;
return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
a = builder.a;
b = builder.b;
c = builder.c;
d = builder.d;
e = builder.e;
f = builder.f;
}
}
調用方法:
/**
* 很常見一種實例化方法吧瓶摆,我見過很多
*/
NutritionFacts nutritionFacts = new NutritionFacts.Builder(10, 8).setC(1).
setD(2).setE(3).setF(4).build();
缺點:
(1)為了創(chuàng)建對象凉逛,必須先創(chuàng)建Builder的構造器。
(2)Builder模式比重疊構造器更加冗長群井,只有在多參的時候才會用到(書上推薦>=4個參數(shù))状飞。
Builder模式的應用場景:
如果類的構造器或者靜態(tài)工廠中有多個參數(shù),Builder模式就是中不錯的選擇书斜!