一、前言
從今天開始計劃用一個月的時間,通過寫讀書筆記的方式來記錄閱讀這本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