日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.39 必要时使用保护性复制(defensive copy)

發布時間:2023/12/29 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.39 必要时使用保护性复制(defensive copy) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下Period類用于表示兩個日期之間的間隔:

?

import java.util.Date;public class Period {private Date start;private Date end;public Period(Date start,Date end){if(start.compareTo(end)>0)throw new IllegalArgumentException("start after end");this.start=start;this.end=end;}public boolean isValid(){return start.compareTo(end)<=0;}public Date getStart() {return start;}public Date getEnd() {return end;} }

?

?

以下測試將失敗:

@Testpublic void testPeriod(){Date start=new Date();Date end=new Date();Period period=new Period(start, end);Assert.assertTrue(period.isValid());end.setYear(1);//修改了傳給Period的參數值Assert.assertTrue(period.isValid());period.getEnd().setYear(1);修改了Period返回的屬性值Assert.assertTrue(period.isValid());}

?

?

如果要求Period的屬性start、end對外部是不可變的(即只有Period內部可以修改此屬性值,外部修改不會對屬性值有任何影響),那么需要對傳入的可變參數值和返回的屬性值(即start,end)進行保護性復制,修改后的Period如下:

?

public class Period {private Date start;private Date end;public Period(Date start,Date end){//需要在校驗前進行保護性復制this.start=new Date(start.getTime());this.end=new Date(end.getTime());if(this.start.compareTo(this.end)>0)throw new IllegalArgumentException("start after end");}public boolean isValid(){return start.compareTo(end)<=0;}public Date getStart() {//返回復制的對象return new Date(start.getTime());}public Date getEnd() {//返回復制的對象return new Date(end.getTime());} }

?

?

另一種修改方式如下:

?

public class Period {//使用不可變的數據類型private long start;private long end;public Period(Date start,Date end){this.start=start.getTime();this.end=end.getTime();if(this.start>this.end)throw new IllegalArgumentException("start after end");}public boolean isValid(){return start<=end;}public Date getStart() {return new Date(start);}public Date getEnd() {return new Date(end);} }

?

?

如果不希望外部修改引起類的屬性的變化,但是屬性的數據類型又是Date,Array,Collection,Map等可變類型,那么應使用保護性復制,使用原則如下:

1.在校驗輸入參數前進行保護性復制

2.如果屬性類型是可變的,在返回給調用者前應進行保護性復制

3.不要使用clone()進行保護性復制,clone()可能返回子類對象,可能導致惡意攻擊

?

保護性復制和不可變類一樣都可能引起性能問題,如果不能使用保護性復制,同時又希望外部修改不引起屬性變化,那么應在注釋里詳細說明,告訴調用者不要進行可能引起屬性值改變的修改。

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的7.39 必要时使用保护性复制(defensive copy)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。