第39條:必要時(shí)進(jìn)行保護(hù)性拷貝

@(EffecitiveJava)[類設(shè)計(jì)|JAVA基礎(chǔ)]

應(yīng)用場景:
當(dāng)我們準(zhǔn)備實(shí)現(xiàn)一個(gè)具有特殊約束條件類的時(shí)候,假設(shè)類的客戶端會(huì)盡其所能的破壞這個(gè)類的約束條件丁存,因此我們必須保護(hù)性設(shè)計(jì)程序扮叨。

擴(kuò)展:
JAVA是一門安全的語言。這就意味著,它對(duì)緩沖區(qū)溢出锉试、數(shù)組越界瘸洛、非法指針以及其它的內(nèi)存破壞錯(cuò)誤都自動(dòng)免疫揍移,而這些錯(cuò)誤卻困擾著諸如C和C++這樣的不安全的語言。在一門安全的語言中反肋,可以確切的知道那伐,無論系統(tǒng)的其他部分發(fā)生什么事,這些類的約束都可以保持為真石蔗。對(duì)于那些“把內(nèi)存當(dāng)做一個(gè)巨大數(shù)組看待”的語言來說罕邀,這是不可能的。

規(guī)范已經(jīng)注意事項(xiàng)

  1. 對(duì)于構(gòu)造器的每個(gè)可變參數(shù)進(jìn)行保護(hù)性拷貝
-1468159668948.png

如上圖所示养距,檢查參數(shù)的合法性(約束)是在保護(hù)性拷貝之后進(jìn)行的燃少。而且參數(shù)的合法性的檢查是針對(duì)保護(hù)性拷貝之后的對(duì)象,而不是針對(duì)原始對(duì)象铃在。

這樣做是為了避免危險(xiǎn)階段來自另外一個(gè)線程的修改參數(shù)阵具。危險(xiǎn)階段指的是檢查參數(shù)開始,直至保護(hù)性拷貝參數(shù)之間的時(shí)間定铜。在計(jì)算機(jī)安全社區(qū)中阳液,這段時(shí)間被稱為TOC、TOU(Time-Of-Use,Time-Of-Check)揣炕。

  1. 對(duì)于參數(shù)類型可以被不可信任類子類化的參數(shù)帘皿,請(qǐng)不要使用clone方法進(jìn)行保護(hù)性拷貝,文摘如下:
-1468160581668.png

原因:不能保證clone方法返回類一定是X類的對(duì)象畸陡,由于JAVA的向上轉(zhuǎn)型特性鹰溜,返回的可能是出于惡意的目的而設(shè)計(jì)的不可信子類的實(shí)例虽填。

  1. 當(dāng)X類提供了可變內(nèi)部成員的訪問能力時(shí),該訪問返回的應(yīng)該是可變內(nèi)部域的保護(hù)性拷貝曹动。

總結(jié):
保護(hù)性拷貝斋日,不僅僅適用于不可變類。當(dāng)編寫構(gòu)造器或方法時(shí)墓陈,如果它要允許客戶提供的對(duì)象進(jìn)入到內(nèi)部數(shù)據(jù)中恶守,則有必要考慮一下,客戶端提供的對(duì)象是否可能是有變的贡必。如果是兔港,就要考慮到你的類是否能容忍對(duì)象進(jìn)入數(shù)據(jù)結(jié)構(gòu)之后發(fā)生變化。如果答案是否定的仔拟,那么就必須使用保護(hù)性拷貝衫樊,并且讓保護(hù)性拷貝之后的對(duì)象而不是原始對(duì)象進(jìn)入到類的內(nèi)部。

保護(hù)性拷貝可能會(huì)帶來性能損失利花,我覺得這是對(duì)的科侈。類的拷貝明顯會(huì)增加一個(gè)方法執(zhí)行的時(shí)間成本。原文說晋被,這種說法并不總是對(duì)的兑徘,但并沒有指出這種情況,我想了想羡洛,也沒想到挂脑。

保護(hù)性拷貝是可以被代替的。如果某些情況下欲侮,拷貝成本收到限制崭闲,并且類信任它的客戶端不會(huì)不恰當(dāng)?shù)男薷慕M件,可以在文檔中顯示聲明不得修改收到影響的組件威蕉,以此代替保護(hù)性拷貝刁俭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市韧涨,隨后出現(xiàn)的幾起案子牍戚,更是在濱河造成了極大的恐慌,老刑警劉巖虑粥,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如孝,死亡現(xiàn)場離奇詭異,居然都是意外死亡娩贷,警方通過查閱死者的電腦和手機(jī)第晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茁瘦,你說我怎么就攤上這事品抽。” “怎么了甜熔?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵圆恤,是天一觀的道長。 經(jīng)常有香客問我纺非,道長哑了,這世上最難降的妖魔是什么赘方? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任烧颖,我火速辦了婚禮,結(jié)果婚禮上窄陡,老公的妹妹穿的比我還像新娘炕淮。我一直安慰自己,他們只是感情好跳夭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布涂圆。 她就那樣靜靜地躺著,像睡著了一般币叹。 火紅的嫁衣襯著肌膚如雪润歉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天颈抚,我揣著相機(jī)與錄音踩衩,去河邊找鬼。 笑死贩汉,一個(gè)胖子當(dāng)著我的面吹牛驱富,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匹舞,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼褐鸥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赐稽?” 一聲冷哼從身側(cè)響起叫榕,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姊舵,沒想到半個(gè)月后晰绎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠢莺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年寒匙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锄弱,死狀恐怖考蕾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情会宪,我是刑警寧澤肖卧,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掸鹅,受9級(jí)特大地震影響塞帐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巍沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一葵姥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧句携,春花似錦榔幸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠢笋,卻和暖如春拨齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昨寞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工瞻惋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人编矾。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓熟史,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窄俏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹂匹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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