第2章 創(chuàng)建和銷毀對(duì)象
第1條:考慮用靜態(tài)工廠方法代替構(gòu)造器
靜態(tài)工廠方法,只是一個(gè)返回類的實(shí)例的靜態(tài)方法夷野。
示例:boolean基本類型轉(zhuǎn)化成Boolean對(duì)象引用
public static Boolean valueOf(boolean e){
return b ? Boolean.TRUE : Boolean.FALSE;
}
優(yōu)勢(shì):
1.有名稱,也就是說看著清楚白守问。
2.不必在每次調(diào)用的時(shí)候都創(chuàng)建新的對(duì)象署恍。(避免了創(chuàng)建不必要的重復(fù)對(duì)象,從而提高了性能)
重復(fù)的調(diào)用返回相同對(duì)象
實(shí)例受控的類:確保是單例侦厚,或者不可實(shí)例化,
使得不可變的類可以確保不會(huì)存在兩個(gè)相等的實(shí)例拙徽,當(dāng)且僅當(dāng)==時(shí)equals() 是true
3.可以返回原返回類型的任何子類型的對(duì)象刨沦。
4.在創(chuàng)建參數(shù)化類型實(shí)例的時(shí)候靶累,使代碼變得更加簡(jiǎn)潔稻扬。
構(gòu)造器參數(shù)
Map<String,List<String>> map = new HashMap<String,List<String>>();
靜態(tài)方法---類型推導(dǎo)
Map<String,List<String>> map = HashMap.newInstance();
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
缺點(diǎn):
1.類如果不包含公有或者受保護(hù)的構(gòu)造器,就不能被子類化雁比。
其實(shí)并不是什么缺點(diǎn)淳蔼,鼓勵(lì)使用復(fù)用侧蘸,而不是繼承。(16條)
2.與其他靜態(tài)方法實(shí)際上沒有任何區(qū)別鹉梨。
但是有慣用的名稱:valueOf,of,newInstance,getInstance,getType,newType等
第2條:遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器
最容易想到的就是讳癌,重疊構(gòu)造器模式。但是隨著參數(shù)增多存皂,造成編寫困難晌坤,閱讀困難。
1.JavaBean模式 :調(diào)用默認(rèn)的無(wú)參構(gòu)造器創(chuàng)建對(duì)象旦袋,然后使用setter方法來(lái)設(shè)置每個(gè)參數(shù)(實(shí)踐中很少用)
當(dāng)然有缺點(diǎn):
構(gòu)造過程JavaBean可能處于不一致的狀態(tài)骤菠。
JavaBean模式阻止了將該類做成不可變的可能。(15條)
2.Builder模式 24
此處有實(shí)例
如果類的構(gòu)造器或者靜態(tài)工廠中具有多個(gè)參數(shù)疤孕,設(shè)計(jì)這種類時(shí)商乎,Builder模式就是種不錯(cuò)的選擇。
*** 第3條:用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性 ***
Singleton 指僅僅被實(shí)例化一次的類祭阀。
工廠方法的優(yōu)勢(shì):提供了靈活性鹉戚;泛型
單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)單例的最佳方法
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){……}
}
*** 第4條:通過私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力 ***
私有構(gòu)造器鲜戒,記得加注釋。
*** 第5條:避免創(chuàng)建不必要的對(duì)象 ***
最好能重用對(duì)象而不是每次需要的時(shí)候都創(chuàng)建一個(gè)相同功能的新對(duì)象抹凳。
如果對(duì)象是不可變的遏餐,它就始終可以被重用。
靜態(tài)的初始化器
static{
...
}
要優(yōu)先使用基本類型而不是裝箱基本類型赢底,要當(dāng)心無(wú)意識(shí)的自動(dòng)裝箱失都。
*** 第6條:消除過期的對(duì)象引用 ***
Stack類自己管理內(nèi)存。存儲(chǔ)池包含了elements數(shù)組(對(duì)象引用單元幸冻,而不是對(duì)象本身)的元素粹庞。
數(shù)組活動(dòng)區(qū)域的元素是已分配的,而數(shù)組其余部分的元素是自用的嘁扼。但是GC不知道信粮。
只要類是自己管理內(nèi)存黔攒,就應(yīng)該警惕內(nèi)存泄露問題趁啸。
緩存:用WeakHashMap
LinkedHashMap是利用它的removeEldlestEntry方法實(shí)現(xiàn)
對(duì)于更復(fù)雜的緩存,使用 java.lang.ref
監(jiān)聽器和其他回調(diào)
回調(diào)立即被當(dāng)成gc :只保存他們的弱引用(weak reference)督惰,如保存成WeakHashMap的鍵
Heap剖析工具---Heap Profiler
*** 第7條:避免使用終結(jié)方法 ***
終結(jié)方法 (finalizer)
不應(yīng)該依賴終結(jié)方法來(lái)更新重要的持久狀態(tài)不傅。
System.gc 和 System。runFinalization 并不保證終結(jié)方法一定會(huì)被執(zhí)行赏胚。
顯式的終止方法——一般與try-finally結(jié)構(gòu)一起使用:
InputStream,OutputStream,sql的close()
Timer的cancel()
終結(jié)方法的好處:為了安全访娶,與對(duì)象的本地對(duì)等體有關(guān)
將終結(jié)方法放到一個(gè)匿名的類里:終結(jié)它的外圍實(shí)例----終結(jié)方法守衛(wèi)者
繼續(xù)補(bǔ)充中。觉阅。崖疤。