Item1、考慮使用static factory methods取代建構子
一般來說,都是透過public的建構子取得一個類別的實體。但你可以考慮在類別中提供一個靜態的factory method,例如:
public static Boolean valueOf(boolean b){
return b? Boolean.TRUE: Boolean.FALSE;
}
使用靜態factory method有以下優點:
- 名稱:使用靜態factory method,有別於建構子的優點在於,你可以取一個適當的名字,尤其在你有多個建構子的情況下,更容易識別會產出怎樣的類別物件。
避免重複建立:在針對immutable類別,可以使用預先建立的實體或是使用cache的機制,進而避免重複的物件產生。
多型:運用interface-based frameworks,封裝類別實作的內容,並用此原生interface作為method的回傳值,而你回傳的物件可以是任意子類型的物件。
減少冗長的參數:以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的缺點:
- 無法被繼承:沒有public建構子的類別,是無法被繼承,也就是無法使用子類別等特性。
- 區別性:這種靜態factory method難以跟一般的靜態方法迅速地區別開來。