Effective 1、建立和銷毀對象——1.1考慮用靜态方法代替構造器
1.一般建立對象的兩種方式:
(1).使用類的公有構造器;
(2).使用類的靜态方法傳回一個執行個體;
2.使用靜态方法建立對象的優點:
(1).靜态方法的名稱由自己取名,而構造器的名字必須和類名一緻:
//構造器建立對象獲得一個素數
BigInteger prime = new BigInteger(int, int, Random);
//靜态方法建立對象獲得素數
BigInteger prime = BogInteger.probablePrime(int, Random);
(2).不必每次調用他們的時候都建立一個新對象:
每次調用構造器都會建立一個對象,而靜态方法會預先構造一個執行個體緩存起來,在調用時傳回次執行個體;
當程式經常請求建立相同對象,并且建立對象的代價很高時,靜态方法代替構造器,會大大提高性能;
(3).靜态工廠方法可以傳回原傳回類型的任何子類型對象:
這樣我們在選擇傳回對象的類是會有更大的靈活性;
(4).在建立參數化類型執行個體的時候,靜态方法使代碼更加簡潔:
//使用構造器
Map<String, List<String>> m = new HashMap<String, List<String>>();
//靜态方法
public static <K, V> HashMap<K, V> newInstance(){
return new HashMap<K, V>();
}
//使用靜态方法建立執行個體
Map<String, List<String>> m = HashMap.newInstance();
3.使用靜态方法建立對象的缺點:
(1).類如果不含有公有的類或者受保護的構造器,就不能被子類化;
(2).它們與其他的靜态方法實際上沒什麼差別;
一些靜态工廠方法的常用名稱:
valueOf——不太嚴格的講,該方法傳回的執行個體與它的參數具有相同的值。這樣的靜态工廠方法實際上是類型轉換方法。
of——valueOf的一種更為簡潔的替代,在EnumSet中使用并流行起來。
getInstance——傳回的執行個體是通過方法的參數描述的,但是不能夠說與參數具有同樣地值。對于Singleton來說,該方法沒有參數,并傳回唯一的執行個體。
newInstance——像getInstance一樣,但newInstance能夠確定傳回的每個執行個體都與所有其他執行個體不同。
getType——像getInstance一樣,但是在工廠方法處于不同的類中的時候使用。Type表示工廠方法所傳回的對象類型。
newType——像newInstance一樣,但是在工廠方法處于不同的類中的時候使用。Type表示工廠方法所傳回的對象類型。
簡而言之,靜态工廠方法和共有構造器都各有用處,我們需要了解他們各自的長處。靜态工廠通常合适,是以切忌第一反應就是提供共有的構造器,而不先考慮靜态工廠。