這個(gè)文集,是我讀Effective Java的筆記。Udacity的老師說哆料,如果你想養(yǎng)成一個(gè)習(xí)慣,就要在你每天的schedule里面拿出一段固定的時(shí)間留給這件事吗铐。深表贊同东亦。下面開始。
這篇是<Effective Java>中的第一條唬渗。
什么是static factory method
看看Boolean.java中的一個(gè)靜態(tài)工廠方法:
//類型轉(zhuǎn)換
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
好處
第一個(gè)好處:可以自己取名字-->方法名中能體現(xiàn)與實(shí)例有關(guān)的信息
構(gòu)造方法可以創(chuàng)建一個(gè)對(duì)象的instance典阵,靜態(tài)工廠方法也可以得到一個(gè)instance。這里一個(gè)顯著的區(qū)別是镊逝,靜態(tài)工廠方法可以自己取名字萄喳。自己取名字有什么好處?很多情況下我們想要?jiǎng)?chuàng)建不同類型的實(shí)例蹋半,會(huì)通過overload(重載)構(gòu)造函數(shù)來達(dá)到目的。但缺點(diǎn)是沒法判斷得到的是什么樣的instance充坑,而取名字的話就可以從方法名中能得到與實(shí)例有關(guān)的信息减江。
這樣做的缺點(diǎn):用戶難以識(shí)別類中到底哪些靜態(tài)方法專門負(fù)責(zé)返回類的實(shí)例。解決方法是采用約定俗成的命名捻爷,比如:
- valueOf:該方法返回的實(shí)例與它的參數(shù)具有同樣的值辈灼,例如:
Integer a=Integer.valueOf(100); //返回取值為100的Integer對(duì)象
- getInstance:返回的實(shí)例與參數(shù)匹配,例如:
Calendar cal=Calendar.getInstance(Locale.CHINA); //返回中國(guó)日歷
第二個(gè)好處:可以返回不同的類型也榄,比如子類
這個(gè)在Collections中用得多巡莹。比如創(chuàng)建一個(gè)List,可以返回一個(gè)ArrayList甜紫。
第三個(gè)好處:不用每次創(chuàng)建新對(duì)象
例如單例模式降宅。還有上面的Boolean的valueOf函數(shù)。
第四個(gè)好處:簡(jiǎn)潔
//使用構(gòu)造器創(chuàng)建
Map<String, List<String>> m1 = new HashMap<String, List<String>>();
//使用靜態(tài)工廠方法創(chuàng)建
Map<String, List<String>> m2 = HashMap.newInstance();
壞處
- 如果類中沒有提供public或protected的構(gòu)造器囚霸,將造成該類不能子類
我的理解:這是因?yàn)檠绻割愔挥衟rivate的構(gòu)造方法,它是沒辦法被子類繼承的拓型。子類的構(gòu)造方法會(huì)自動(dòng)用super()調(diào)用父類的public/protected構(gòu)造方法额嘿,但如果沒有public或者protected方法瘸恼,就沒法被繼承。
「單例」的新理解
這里我對(duì)單例有了更深刻的理解册养。因?yàn)閱卫褪侵挥衟rivate的構(gòu)造方法的东帅;這即是說,單例的意義不僅僅在于不創(chuàng)建新的實(shí)例球拦,而且在于不返回這個(gè)實(shí)例的任何子類instance靠闭。
private Singleton() {}
(突然想去去年面試網(wǎng)易,人家讓我寫個(gè)單例我都寫得磕磕絆絆刘莹。阎毅。
- 靜態(tài)工廠方法和其他靜態(tài)方法本質(zhì)上并沒有區(qū)別。