本文雖然說(shuō)要重用對(duì)象菇爪,但是如果創(chuàng)建對(duì)象的代價(jià)不是很大,其實(shí)并不在意是否重用對(duì)象柒昏;而且本文提到的內(nèi)容也主要是如何避免無(wú)謂的重復(fù)創(chuàng)建對(duì)象凳宙。
最好重用對(duì)象
最好能重用對(duì)象,而不是在每次需要的時(shí)候創(chuàng)建一個(gè)相同功能的新對(duì)象职祷。
重用方式既快速氏涩,又流行。
如果對(duì)象是不可變的有梆,它就始終可以被重用是尖。
下面的版本可以保證對(duì)于所有在同一臺(tái)虛擬機(jī)中運(yùn)行的代碼,只要它們包含相同的字符串字面常量泥耀,該對(duì)象就會(huì)被重用饺汹。
同時(shí)提供靜態(tài)工廠方法和構(gòu)造函數(shù)的不可變類
最好使用靜態(tài)工廠方法而不是構(gòu)造函數(shù),以避免創(chuàng)建不必要的對(duì)象痰催。Boolean.valueOf(String)
優(yōu)于Boolean(String)
兜辞。
構(gòu)造函數(shù)在每次被調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)新的對(duì)象,而靜態(tài)工廠方法則從來(lái)不會(huì)這樣做陨囊。
重用那些已知不會(huì)被修改的可變對(duì)象
除了重用不可變的對(duì)象之外弦疮,也可以重用那些已知不會(huì)被修改的可變對(duì)象。
正確做法:
如果Person
類被實(shí)例化后蜘醋,isBabyBoomer
方法卻永遠(yuǎn)不會(huì)被調(diào)用胁塞,那就沒(méi)有必要初始化BOOM_START
和BOOM_END
域。通過(guò)延遲初始化压语,有可能消除這些不必要的初始化工作啸罢,但是不建議這樣做。這樣做會(huì)使方法的實(shí)現(xiàn)更加復(fù)雜胎食,卻無(wú)法將性能顯著提高到超過(guò)已經(jīng)達(dá)到的水平扰才。
不要?jiǎng)?chuàng)建多個(gè)適配器對(duì)象
適配器也叫做視圖。
適配器:它把功能委托給一個(gè)后備對(duì)象厕怜,從而為后備對(duì)象提供一個(gè)可以代替的接口衩匣。由于適配器除了后備對(duì)象之外蕾总,沒(méi)有其他的狀態(tài)信息,所以針對(duì)某個(gè)給定對(duì)象的特定適配器而言琅捏,它不需要?jiǎng)?chuàng)建多個(gè)適配器實(shí)例生百。
Map
接口的keySet
方法返回該Map
對(duì)象的Set
視圖。對(duì)于一個(gè)給定的Map
對(duì)象柄延,實(shí)際上每次調(diào)用keySet
都返回相同的Set
實(shí)例蚀浆。返回的Set
實(shí)例是可變的。
創(chuàng)建多余對(duì)象的新方法:自動(dòng)裝箱
上面的程序構(gòu)造了大約2^31個(gè)多余的
Long
實(shí)例搜吧。要優(yōu)先使用基本類型而不是裝箱基本類型市俊,要當(dāng)心無(wú)意識(shí)的自動(dòng)裝箱。
不必要地創(chuàng)建對(duì)象只會(huì)影響程序的風(fēng)格和性能
通過(guò)創(chuàng)建附加的對(duì)象滤奈,提升程序的清晰性摆昧、簡(jiǎn)潔性和功能性,是好事僵刮。
通過(guò)維護(hù)自己的對(duì)象池來(lái)避免創(chuàng)建對(duì)象并不是一種好的做法据忘,除非池中的對(duì)象是非常重量級(jí)的。
維護(hù)自己的對(duì)象池必定會(huì)把代碼弄得很亂搞糕,同時(shí)增加內(nèi)存占用勇吊,并且還會(huì)損害性能。現(xiàn)在的JVM實(shí)現(xiàn)具有高度優(yōu)化的垃圾回收器窍仰,其性能很容易就會(huì)超過(guò)輕量級(jí)對(duì)象池的性能汉规。
不必要地創(chuàng)建對(duì)象只會(huì)影響程序的風(fēng)格和性能。