Item1、考慮使用static factory methods取代建構子

一般來說,都是透過public的建構子取得一個類別的實體。但你可以考慮在類別中提供一個靜態的factory method,例如:

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

使用靜態factory method有以下優點:

  1. 名稱:使用靜態factory method,有別於建構子的優點在於,你可以取一個適當的名字,尤其在你有多個建構子的情況下,更容易識別會產出怎樣的類別物件。
  2. 避免重複建立:在針對immutable類別,可以使用預先建立的實體或是使用cache的機制,進而避免重複的物件產生。

  3. 多型:運用interface-based frameworks,封裝類別實作的內容,並用此原生interface作為method的回傳值,而你回傳的物件可以是任意子類型的物件。

  4. 減少冗長的參數:以Map舉例,除了宣告,建立物件時也要指定類型參數:

    Map<String, List<String>> map = new HashMap<String, List<String>>();
    

假設HashMap提供以下static factory method:

 public stratic <K,V> HashMap<K,V> newInstance(){
  return new HashMap<K,V>();
 }

那你在建立物件時就可以簡單的呼叫這個方法:

 Map<String, List<String>> map = HashMap.newInstance();

使用靜態factory method的缺點:

  1. 無法被繼承:沒有public建構子的類別,是無法被繼承,也就是無法使用子類別等特性。
  2. 區別性:這種靜態factory method難以跟一般的靜態方法迅速地區別開來。

results matching ""

    No results matching ""