Effective Java - 用靜態工廠方法代替構造器

先看代碼,這是boolean包裝類Boolean,其內部就有靜態工廠方法。

public final class Boolean {

    public static final java.lang.Boolean TRUE = new java.lang.Boolean(true);

    public static final java.lang.Boolean FALSE = new java.lang.Boolean(false);

    public static java.lang.Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
}

靜態工廠方法優點

  • 工廠方法有方法名,通常我們都是通過重載構造器的方式構造不同的對象,有時我們可能傳入同樣的參數,但其他參數的默認值不同,這時構造器就不能滿足我們要求。而且參數過多容易導致錯誤,也不容易理解,靜態方法名能描述要被返回對象,更易於使用。

  • 不必每次都創建一個新對象,靜態工廠方法能夠爲重複的調用返回相同對象,如Boolean,其內部有兩個預先定義好的常量(TRUE,FALSE),當我們調用Boolean.va lueOf (b oolean )時會得到其中一個,不會每次都創建一個新對象,這樣有助於類總能嚴格控制在某個時刻哪些實例應該存在,也會提高性能。

  • 它們可以返回原返類型的任何子類型的對象,這樣在選擇返回對象的類型時就靈活很多,如:java.util.Collections。

  • 所返回的對象的類可以隨着每次調用而發生變化,這取決於靜態工廠方法的參數值。

  • 方法返回的對象所屬的類,在編寫包含該靜態工廠方法的類時可以不存在 這

靜態工廠方法的缺點

  • 類如果不含公有的或者受保護的構造器,就不能被子類化。 這也不全是缺點,因爲我們在寫代碼是要多用組合,少用繼承。

  • 靜態工廠方法不容易被發現, 當我們要創建一個類的對象時,要有意識地在該類搜索靜態工廠方法。

靜態工廠方法的常用名稱

  • from一一類型轉換方法,它只有單個參數,返回該類型的一個相對應的實例,例如:
Date d = Date.from(instant) ; 
  • of一一聚合方法,帶有多個參數,返回該類型的一個實例,把它們合併起來,例如
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
  • valueOf一一比 from和of 更煩瑣的一種替代方法,例如
Bigintege prime = Bigintege.valueOf(Intege.MAX_VALUE);
  • instance 或者 getInstance一一返回的實例是通過方法的(如有)參數來描述的,但是不能說與參數具有 同樣的值,例如
StackWalke luke = StackWalke.getinstance(options);
  • create 或者 newInstance一一像 instance 或者 getinstaηce 一樣,但 create或者 newInstance 能夠確保每次調用都返回一個新的實例 ,例如:
Object newArray = Array.newinstance(classObject, arraylen 〕;
  • getType一像getInstaηce 一一樣,但是在工廠方法處於不同的類中的時候使用。Type 表示工廠方法所返回的對象類型,例如:
FileSto fs = Files.getFileStore(path];
  • newType一像newinstance一一樣,但是在工廠方法處於不同的類中的時候使用。 Type 表示工廠方法所返回的對象類型,例如:
BufferedReade br= Files.newBuffeedReade(path);
  • type一一getype和newType 的簡版,例如:
List<Complaint> litany Collections.list(legacylitany〕;

簡而言之,靜態工廠方法和公有構造器都各有用處,我們需要理解它們各自的長處靜態工廠經常更合適,因切忌第一反應就是提供公有的構造器, 而不先考慮靜態工廠。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章