一、前言
從今天開始計劃用一個月的時間,通過寫讀書筆記的方式來記錄閱讀這本Java領域經典中的經典書籍 - Effective Java過程中自己所思所想,以備以後查閱,同時分享出去也希望可以幫助到其他人,廢話不多說,現在開始第一篇:創建和銷毀對象。
二、考慮用靜態工廠方法代替構造器
①. 一般我們有什麼辦法可以創建對象呢?
方法1: 使用類公有構造器。
方法2:使用類的靜態方法返回一個實例。
②. 使用靜態方法創建對象有什麼優點?
優點1: 靜態工廠方法的名字是由我們自己命名,而構造方法必須與類同名。
PrimeNumber primeNumber1 = new PrimeNumber(int Random); // 返回一個素數 PrimeNumber primeNumber2 = PrimeNumber.newInstance(); // 使用靜態工廠方法表示更為清楚
優點2: 構造方法每次調用的時候都需要創建一個對象,而靜態工廠方法每次調用的時候就不會創建一個新的對象,這對於一個要頻繁創建對象的程序來說,可以極大的提高性能,單例模式就是這樣實現的。
優點3: 靜態工廠方法可以返回原返回類型的任何子類型的對象,這樣使我們在選擇返回對象的類時就有了更大的靈活性。
class Father {
private Father() {
}
public static Father newInstance(String type) {
if (type.equals("ChildA")) { // 根據類型判斷返回那個子類對象
return new ChildA();
} else {
return new ChildB();
}
}
public void getName() {
System.out.println("My name is father");
}
private static class ChildA extends Father {
public void getName() {
System.out.println("My name is child A");
}
}
private static class ChildB extends Father {
public void getName() {
System.out.println("My name is child B");
}
}
}
public class Test {
public static void main(String[] args) {
Father c1 = Father.newInstance("ChildA");
c1.getName();
Father c2 = Father.newInstance("ChildB");
c2.getName();
}
}
查看本欄目
優點4: 靜態工廠方法在創建參數化類型實例的時候,可以使代碼變得更加簡潔。
private Map<String, List<String>> map = new HashMap<String, List<String>>();
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
③. 使用靜態工廠方法創建對象有什麼缺點?
缺點1: 如果一個類只能通過靜態工廠方法來獲得實例,那麼該類的構造函數就不能是共有的或受保護的,那麼該類就不會有子類,即該類不能被繼承。單例模式中首先要私有化構造器。
缺點2:靜態工廠方法和其他靜態方法從名字上看無法區分,所以我們可以約定靜態工廠方法名字使用valueOf或者getInstance。
④. 什麼時候用靜態工廠方法,什麼時候用構造器呢?
靜態工廠方法和共有構造器各有用處,我們需要理解他們各自的長處,靜態工廠通常更加合適,因此切忌第一反應就是提供公有的構造器,而不先考慮靜態工廠。
作者:csdn博客 zdp072