創(chuàng)建和銷毀對象--effective java

前言

這是第一次學習寫博客總結(jié)就珠,很多的不足的地方趣些,請客官多多指正日丹,有關(guān)java的地方,多多交流

現(xiàn)在進入正題:

一怎抛、考慮用靜態(tài)工廠方法代替構(gòu)造器

這里說的工廠方法和設(shè)計模式里面的工廠方法是有區(qū)別的卑吭,

設(shè)計模式里的工廠模式是定義一個創(chuàng)建對象的接口,讓子類選擇去實現(xiàn)哪一個類马绝,工廠模式讓一個類的初始化延遲到其子類(設(shè)計模式之禪)豆赏。

effective java中的靜態(tài)工廠只是為一個類提供一個靜態(tài)方法,它本質(zhì)是和當前類的其他靜態(tài)方法沒有區(qū)別,只是它是用來創(chuàng)建對象的河绽。和構(gòu)造器相比己单,提供的靜態(tài)方法本身具有一些優(yōu)勢,在于易閱讀耙饰,易使用纹笼,而且可以提供方法參數(shù),并且返回的對象可以協(xié)變成子類苟跪,相當?shù)木哂徐`活性廷痘。還有一個比較常見的好處是 在創(chuàng)建參數(shù)化類型實例的時候,和傳統(tǒng)的構(gòu)造器相比可以讓代碼更簡潔件已,比較實例如下:

傳統(tǒng)構(gòu)造器:?

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

可以看到笋额,傳統(tǒng)的構(gòu)造需要在后面再寫一遍,但是篷扩,提供了靜態(tài)工廠方法后兄猩,這種情況就不再出現(xiàn)了:

靜態(tài)工廠方法:

public? static <K,V> HashMap<K,V> newInstance(){

return new HashMap<K,V>();

}

靜態(tài)方法構(gòu)造:

Map <String,List<String>> map = HashMap.newInstance();

直接看出來,簡便了很多鉴未。枢冤。。

靜態(tài)方法的缺陷铜秆,如果類沒有實現(xiàn)公有的或者受保護的構(gòu)造器淹真,那么不能實現(xiàn)子類化。连茧。

二核蘸、當對象的字段過多的時候,考慮使用Builder模式

我們在創(chuàng)建一個對象的時候啸驯,有幾種方式設(shè)置內(nèi)部參數(shù)

1.直接使用構(gòu)造器客扎,一般來說,都會創(chuàng)建一個構(gòu)造方法坯汤,將字段值放在構(gòu)造器里一起創(chuàng)建虐唠,但是當字段過多的時候,很容易造成字段很難區(qū)分惰聂,比如:

public Demo(String field1,String field2,int field3,int field4,int field5){}?

在實際開發(fā)中疆偿,字段的命名請規(guī)范且易理解,考慮加上doc注釋搓幌,不要像實例的一樣杆故。可以看到當字段很多的時候溉愁,類型基本相同的時候处铛,很難區(qū)分各個字段饲趋,所以很容易造成錯誤,就像把field3 field4 field5 的字段順序?qū)戝e了撤蟆,這個時候最好的結(jié)果是程序拋出運行時異常奕塑,最壞的結(jié)果程序可能還在運行中,且沒有拋出錯誤家肯,這時候的邏輯已經(jīng)出錯龄砰,而且不易發(fā)現(xiàn),很難查找讨衣,但是整個程序已經(jīng)偏離了我們的期望换棚。

2.使用JavaBeans方法,通過調(diào)用默認的無參構(gòu)造器反镇,構(gòu)造一個對象固蚤,之后通過提供的setter() 方法一個個的給字段添加值。

Demo demo = new Demo();

demo.setField1(field);

demo.setField2(field);

這樣的方法歹茶,可以很輕松的給每一個字段賦值夕玩,但是缺陷的地方在于給每個字段賦值都是分開的操作,可能造成狀態(tài)不一致惊豺。類無法僅僅通過檢驗構(gòu)造器參數(shù)的有效性來保證一致性风秤。試圖使用處于這樣不一致狀態(tài)的對象,將會導致失敗扮叨,這種失敗與包含錯誤的代碼大相徑庭,因此調(diào)試起來也十分困難领迈。另一點不足在于彻磁,JavaBeans模式防止了把類做成不可變的可能(15條有講),這就需要程序員付出格外努力來確保它的線程安全狸捅。

3.使用Builder模式構(gòu)造對象衷蜓,既可以實現(xiàn)像javaBeans的給字段一一賦值,也不會像直接使用構(gòu)造器一樣尘喝,容易造成字段混亂磁浇。比較常見的Builder模式實例? StringBuilder類,可以查看相關(guān)源碼朽褪。這里就不寫代碼了置吓。StringBuilder的缺陷在于,每一次創(chuàng)建對象的時候都需要先創(chuàng)建一個它的builder對象缔赠,然后才能創(chuàng)建對象衍锚。

三、使用私有構(gòu)造器或者枚舉來強化singleton屬性

對于單例模式嗤堰,要保證只存在只有一個對象實例戴质,一直以來都有很多實現(xiàn)方式,大多脫不出這兩種范圍

1,私有構(gòu)造器告匠,和靜態(tài)的單例對象字段

例如:

public class SingletonDemo{

public static SingletonDemo demo = new SingletonDemo();

private SingletonDemo(){}

}

這種方法實現(xiàn)的單例戈抄,保證了只存在一個實例,但是有種情況是后专,如果特權(quán)用戶用AccessibleObject.setAccess方法通過反射划鸽,可以調(diào)用當前類的私有構(gòu)造器,從而創(chuàng)建新對象行贪,對于抵御這種情況漾稀,需要添加判斷,在第二次創(chuàng)建對象的時候拋出異常就可以了建瘫。

2.靜態(tài)方法崭捍,私有的字段,私有的構(gòu)造器

public class SingletonDemo{

private static SingletonDemo demo = new SingletonDemo();

private SingletonDemo(){}

public static SingletonDemo getInstance(){ return? demo; }

}

這種方法也保證了只有一個實例啰脚,但是不管這種方法還是前面一種方法殷蛇,如果要實現(xiàn)Serializable接口,使得對象可序列化橄浓,就會出現(xiàn)問題粒梦,在反序列化的時候,readObject()方法不管顯示的還是默認的荸实,都會提供一個新的對象給我們匀们,導致反序列化單例失敗,這種情況需要提供readResolve()方法准给,當反序列化的時候泄朴,readResolve()方法調(diào)用時,返回當前對象的引用來替換新建對象的引用露氮,如

public SingletonDemo readResolve(){ return demo;}

這樣就可以防止對象重復創(chuàng)建了

3.單元素枚舉----其實這是實現(xiàn)單例的最好方法了

在java引入枚舉之后祖灰,枚舉就成了單例實現(xiàn)的最優(yōu)方式,它可以自動維護對象的個數(shù)畔规,絕對防止重復局扶。因為enmu的元素就是enmu的實例,當只有一個元素的時候叁扫,它就只存在一個實例三妈,枚舉的用處有很多,不懂得可以去看看基礎(chǔ)書(java程序設(shè)計語言 阿諾德莫绣,java編程思想)

public enmu SingletonDemo{

demo;

public void doSomething(){}

}

調(diào)用的時候沈跨,直接寫成SingletonDemo.demo.doSomething()就可以了

四,使用私有構(gòu)造器強化不可實例化的類屬性

這條其實很簡單兔综,在我們代碼中饿凛,有很多類是不需要實例化的狞玛,比如以前的配置類(現(xiàn)在不推薦這么寫,可以考慮使用枚舉來寫)涧窒,工具類等心肪,它只包含了靜態(tài)方法,靜態(tài)字段纠吴,我們不需要給它實例化硬鞍,這個時候,可以使用私有構(gòu)造器戴已,防止有人不小心實例化這個類固该。

注意:在給予私有構(gòu)造器的時候,請寫doc注釋糖儡,說明為什么這個類使用私有構(gòu)造器伐坏,因為私有之后直接創(chuàng)建對象也不能子類化了

五、避免創(chuàng)建不必要的對象

在代碼中握联,其實很多這樣的規(guī)則我們已經(jīng)在遵守了桦沉,但是這里還是寫出來,警惕自己犯錯

1.使用基本數(shù)據(jù)類型來替代包裝器類金闽,避免自動裝箱纯露,java引入自動裝箱和拆箱操作之后,基本數(shù)據(jù)類型和包裝器類之間其實很模糊了代芜,但是優(yōu)先使用基本數(shù)據(jù)類型可以有效避免創(chuàng)建多余對象埠褪。基本數(shù)據(jù)類型是直接將值存在堆棧中挤庇,來保證高效组橄,但是包裝器類對象是保存在堆中的

2.對于同時提供了靜態(tài)工廠方法和構(gòu)造器的不可變類,使用靜態(tài)工廠方法罚随,避免創(chuàng)建不必要對象--

3.重(chong)用已知的可變但不會修改的對象

4.維護對象池并不是好做法,除非真的是非常重量級的對象羽资,比較常規(guī)的是數(shù)據(jù)庫連接池和緩存連接池

六淘菩、消除過期引用

過期引用這點,其實牽扯到內(nèi)存泄漏(指的是被無意識的保存的對象屠升,導致內(nèi)存變谐备摹),所以在類自己管理內(nèi)存時腹暖,請警惕內(nèi)存泄漏的問題汇在,消除過期引用。

可以使用WeakHashMap來存儲 緩存 和監(jiān)聽器脏答,回調(diào)糕殉。這樣在內(nèi)存不夠的時候gc會優(yōu)先清理這部分亩鬼,達到釋放內(nèi)存的效果。

七阿蝶,避免使用finalizer方法

finalizer()一般來說很少用到雳锋,它的運行是不可預測的,gc并不保證你調(diào)用了這個方法之后羡洁,它就馬上運行玷过,而且調(diào)用這個方法會造成嚴重的性能損耗(java虛擬機)


結(jié)語

昨晚就花了我?guī)讉€小時的時間整理,今天中午午睡時間才打完發(fā)的筑煮,第一次寫很多地方都寫不好辛蚊,考慮不周全或者錯誤,不足的地方真仲,請多多指教袋马。來簡書是因為覺得里面的博客都很簡潔,不太喜歡csdn的博客樣子袒餐,哈哈飞蛹,可以看到后面幾條我寫的非常少,這些都是正常的注意下就好了灸眼,其實書上是有很多的內(nèi)容卧檐,推薦去看本書,認真研讀幾遍幫助很大焰宣,謝謝努力的自己和努力的你~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霉囚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匕积,更是在濱河造成了極大的恐慌盈罐,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闪唆,死亡現(xiàn)場離奇詭異盅粪,居然都是意外死亡,警方通過查閱死者的電腦和手機悄蕾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門票顾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帆调,你說我怎么就攤上這事奠骄。” “怎么了番刊?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵含鳞,是天一觀的道長。 經(jīng)常有香客問我芹务,道長蝉绷,這世上最難降的妖魔是什么鸭廷? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮潜必,結(jié)果婚禮上靴姿,老公的妹妹穿的比我還像新娘。我一直安慰自己磁滚,他們只是感情好佛吓,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垂攘,像睡著了一般维雇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晒他,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天吱型,我揣著相機與錄音,去河邊找鬼陨仅。 笑死津滞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的灼伤。 我是一名探鬼主播触徐,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狐赡!你這毒婦竟也來了撞鹉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颖侄,失蹤者是張志新(化名)和其女友劉穎鸟雏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览祖,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡孝鹊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了展蒂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片又活。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玄货,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悼泌,我是刑警寧澤松捉,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站馆里,受9級特大地震影響隘世,放射性物質(zhì)發(fā)生泄漏可柿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一丙者、第九天 我趴在偏房一處隱蔽的房頂上張望复斥。 院中可真熱鬧,春花似錦械媒、人聲如沸目锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢虹。三九已至,卻和暖如春主儡,著一層夾襖步出監(jiān)牢的瞬間奖唯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工糜值, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丰捷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓寂汇,卻偏偏與公主長得像病往,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子健无,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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