第二章 創(chuàng)建和銷毀對(duì)象

1.考慮用靜態(tài)工廠方法代替構(gòu)造器

靜態(tài)工廠方法與構(gòu)造器不同的優(yōu)勢(shì)在于:

1.他們有名稱(容易閱讀)

2.不用每次調(diào)用創(chuàng)建一個(gè)新的對(duì)象

3.返回原返回類型的任何子類型的對(duì)象(服務(wù)提供者框架)

4.在創(chuàng)建參數(shù)化類型實(shí)例的時(shí)候,使代碼變得更簡(jiǎn)潔

例: Map<String,List<String>> map = new HashMap<String,List<String>>();

例如提供靜態(tài)工廠方法: public static <K, V> HashMap<K, V> newInstance { return new HashMap<K, V>(); }

變成: Map> map = HashMap.newInstance();?

缺點(diǎn)在于:

1.類如果不含公有的或者受保護(hù)的構(gòu)造器,就不能被子類化 (推薦使用組合探入,而不是繼承)

2.與其他靜態(tài)方法沒(méi)有區(qū)別(不容易識(shí)別)法希,但是有一些命名習(xí)慣表示 valueOf() of() getInstance() newInstance() getType() newType()

思想上就是提供公有構(gòu)造器的時(shí)候 先想到靜態(tài)工廠

2.遇到多個(gè)構(gòu)造器參數(shù)的時(shí)候考慮構(gòu)建器

構(gòu)造器多個(gè)參數(shù)的問(wèn)題:

1. 直接傳參典奉,參數(shù)多的時(shí)候難于編寫(xiě)、閱讀悯舟,容易出錯(cuò)

例: public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate){ }

2. 使用javaBeans 模式,就是創(chuàng)建一個(gè)java bean 將參數(shù)set進(jìn)去,然后將javabean作為參數(shù)潦嘶,彌補(bǔ)了問(wèn)題1,但是缺點(diǎn)在于:

java bean 可能處于不一致的狀態(tài)崇众,需要確保它的線程安全

3. 構(gòu)造器模式

public class NutritionFacts {

????private final int servingSize;

????private final int servings;

????public static class Builder{

????????private final int servingSize;

????????private final int servings;

????????public Builder(int servingSize){ this.servingSize = servingSize; }

????????public Builder setServings(int servings){

????????????this.servings = servings;

????????}

????????public NutritionFacts build(){

? ? ????????return new NutritionFacts(this);

????????}

????}

????private NutritionFacts(Builder builder){

????????servingSize = builder.servingSize;

????????servings = builder.servings;

????}

}

調(diào)用: NutritionFacts cocaCola = new NutritionFacts.Builder(240).setServings(8).builder();

3.用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性

單例模式:

1.構(gòu)造器私有化(但是可以通過(guò)反射調(diào)用掂僵,在創(chuàng)建第二個(gè)實(shí)例時(shí)拋出異常)

public class Elvis {

? ? public static final Elvis INSTANCE = new Elvis();

? ? private Elvis(){}

}

2.公有的成員是個(gè)靜態(tài)工廠方法

public class Elvis {? ?

????private static final Elvis INSTANCE = new Elvis();? ??

????private Elvis(){}

? ? public static Elvis getInstance(){

? ? ????return INSTANCE;

????}

? ? private Objcet readResolve(){

? ? ? ? return INSTANCE;

????}

}

在序列化時(shí)會(huì)創(chuàng)建新的實(shí)例,需要加入readResolve方法顷歌,反序列化時(shí)如果有readResolve方法就會(huì)調(diào)用

3.枚舉(最佳)

public enum Elvis{

? ? INSTANCE;

? ? public void leaveTheBuilding(){}

}

4.通過(guò)私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力

有些工具類不希望被實(shí)例化锰蓬,實(shí)例對(duì)它沒(méi)有意義 java.lang.Math ,最好加上注釋

public class UtilityClass {

? ? // 阻止實(shí)例化

????private UtilityClass(){

? ? ? ? throw new AssertionError();

? ? }

}

5.避免創(chuàng)建不必要的對(duì)象

例:String s = new String("hello"); // 錯(cuò)誤

String s = "hello";

當(dāng)你應(yīng)該重用現(xiàn)有對(duì)象的時(shí)候眯漩,請(qǐng)不要?jiǎng)?chuàng)建新的對(duì)象芹扭。當(dāng)你創(chuàng)建新的對(duì)象的時(shí)候,請(qǐng)不要重用現(xiàn)有對(duì)象

重用對(duì)象付出的代價(jià)要遠(yuǎn)遠(yuǎn)大于因創(chuàng)建重復(fù)對(duì)象而付出的代價(jià)

6.消除過(guò)期的對(duì)象引用

過(guò)期引用:永遠(yuǎn)也不會(huì)被解除的引用

修復(fù)方法:清空引用? 引用 = null;

一般而言赦抖,只要類是自己管理內(nèi)存舱卡,就應(yīng)該警惕內(nèi)存泄露問(wèn)題。一旦元素被釋放掉队萤,則該元素包含的任何對(duì)象引用都應(yīng)該被清空轮锥。

內(nèi)存泄露的另一個(gè)常見(jiàn)來(lái)源是緩存,容易遺忘掉要尔。解決舍杜,使用WeakHashMap或者創(chuàng)建一個(gè)清除工作的后臺(tái)線程,java.util.LinkedHashMap.removeEldestEntry刪除舊條目

第三個(gè)常見(jiàn)來(lái)源是監(jiān)聽(tīng)器和其他回調(diào)新娜,實(shí)現(xiàn)了一個(gè)API,客戶端在這個(gè)API中注冊(cè)蝴簇,沒(méi)有顯示的取消注冊(cè)杯活,就會(huì)聚集。確卑敬剩回調(diào)立即被當(dāng)做垃圾的最佳方法是保存他們的弱引用旁钧,例如:只講他們保存成WeakHashMap的鍵

7.避免使用終結(jié)方法

終結(jié)方法( finalizer ) 通常是不可預(yù)測(cè)的,也是很危險(xiǎn)的互拾,一般情況下是不必要的歪今。使用終結(jié)方法會(huì)導(dǎo)致行為不穩(wěn)定、降低性能颜矿,以及可移植性問(wèn)題寄猩。

終結(jié)問(wèn)題缺點(diǎn)在于不能保證會(huì)被及時(shí)的執(zhí)行。從一個(gè)對(duì)象變得不可達(dá)開(kāi)始骑疆,到它的終結(jié)方法被執(zhí)行田篇,所花費(fèi)的時(shí)間是任意長(zhǎng)的。

java語(yǔ)言規(guī)范不僅不保證終結(jié)方法被及時(shí)的執(zhí)行箍铭,而且不保證它們會(huì)被執(zhí)行泊柬。

使用終結(jié)方法有一個(gè)非常嚴(yán)重的性能損失

解決:提供一個(gè)顯示的終止方法 ,顯示的終止方法通常與try-finally結(jié)構(gòu)結(jié)合起來(lái)使用诈火。在finally子句內(nèi)部調(diào)用顯示的終止方法兽赁。

終結(jié)方法2個(gè)用途:第一種:當(dāng)忘記調(diào)用顯示終結(jié)方法時(shí),可以充當(dāng)安全網(wǎng)冷守。

第二種:與對(duì)象的本地對(duì)等體有關(guān)刀崖,本地對(duì)等體是一個(gè)本地對(duì)象,普通對(duì)象通過(guò)本地方法委托給一個(gè)本地對(duì)象拍摇。因?yàn)楸镜貙?duì)象不是一個(gè)普通對(duì)象亮钦,所以垃圾回收器不會(huì)知道它,當(dāng)它的java對(duì)等體被回收的時(shí)候授翻,它不會(huì)被回收或悲。在本地對(duì)等體并不用于關(guān)鍵資源的前提下,終止方法正式執(zhí)行這項(xiàng)任務(wù)最合適的工具堪唐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翎蹈,隨后出現(xiàn)的幾起案子淮菠,更是在濱河造成了極大的恐慌,老刑警劉巖荤堪,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件合陵,死亡現(xiàn)場(chǎng)離奇詭異枢赔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拥知,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)踏拜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人低剔,你說(shuō)我怎么就攤上這事速梗。” “怎么了襟齿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵姻锁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猜欺,道長(zhǎng)位隶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任开皿,我火速辦了婚禮涧黄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赋荆。我一直安慰自己笋妥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布糠睡。 她就那樣靜靜地躺著挽鞠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狈孔。 梳的紋絲不亂的頭發(fā)上信认,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音均抽,去河邊找鬼嫁赏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛油挥,可吹牛的內(nèi)容都是我干的潦蝇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼深寥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攘乒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起惋鹅,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤则酝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闰集,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沽讹,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡般卑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽雄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝠检。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挚瘟,靈堂內(nèi)的尸體忽然破棺而出叹谁,到底是詐尸還是另有隱情,我是刑警寧澤刽沾,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布本慕,位于F島的核電站,受9級(jí)特大地震影響侧漓,放射性物質(zhì)發(fā)生泄漏锅尘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一布蔗、第九天 我趴在偏房一處隱蔽的房頂上張望藤违。 院中可真熱鬧,春花似錦纵揍、人聲如沸顿乒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)璧榄。三九已至,卻和暖如春吧雹,著一層夾襖步出監(jiān)牢的瞬間骨杂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工雄卷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搓蚪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓丁鹉,卻偏偏與公主長(zhǎng)得像妒潭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揣钦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容