必要時進行保護性拷貝(39)

一、java 語言是一門安全型語言java

  • 緩衝溢出、數組越界、非法指針等破壞性內存錯誤自動免疫

二、儘管安全,若是不採起保護措施,仍是沒法與其餘類隔離開來程序員

  • 好比,有人試圖破壞系統的安全性
  • 更有可能的是對你的api產生誤解的程序員,產生各類不可預期的後果
  • 不管如何,編寫一些面對不良操做仍保持健壯性的類是很必要的

三、舉例以下,即是一段不可變的時間週期api

  • 沒有對象的幫襯,另外一個類不可能修改對象的內部狀態,可是對象容易無心識提供幫襯

  • 以下,倆引用是final ,可是 end 對象是可變的(p.end 不可變,可是兩者指向同一個對象)

爲了不內部信息不受這種攻擊,對於構造器的每一個可變參數進行保護性拷貝是必要的數組

  • 保護性拷貝,在檢查參數有效性以前進行
  • 而且有效性檢查針對拷貝後的對象

三、對於參數能夠被不可信任方子類化的參數,請不要使用clone 方法進行保護性拷貝安全

  • 對於非 final類型,不能保證clone 返回的必定是該類型,也多是其子類
  • 也可使用別的方法 改變 p.end 的修改權限

  • 可變內部域,保護性拷貝

  • 這樣,除了類自己以外,其餘任何類都沒法訪問其任何一個可變域

四、每當編寫方法或構造器時數據結構

  • 若是容許,客戶提供的對象進入數據結構,有必要考慮下該對象是不是可變的
  • 考慮類是否可以容忍,對象進入數據結構後還能變化,不能容忍就要考慮保護性拷貝

五、內部組件被返回給客戶以前,對他們進行保護性拷貝,道理同樣性能

  • 在把一個指向內部可變組件的引用返回給客戶端時,要考慮清楚,最好使用保護性拷貝
  • 長度非零的數組是可變的

只要有可能,都要把不可變對象最爲內部組件,這樣就沒必要再爲保護性拷貝操心3d

  • 有經驗的程序員,都是用 Date.getTime() 返回的基本類型做爲時間

六、保護性拷貝會帶來相關性能損失,但不都是這樣指針

  • 若是承諾再也不修改相關對象,能夠考慮不進行保護性拷貝
  • 文檔中必定要寫清楚

七、若是方法或構造器的調用,須要移交對象的控制權,這個類就沒法自身抵禦惡意客戶端對象

  • 好比對象直接訪問被包裝的對象,就會破壞包裝類對象約束條件
相關文章
相關標籤/搜索