eff java 39条
必要时进行保护性拷贝
现状:没有考虑到存在这个问题
原因:没有考虑过一个类的约束条件被破话
保护性拷贝:
情景,当一个类有约束条件时
class Period {
private Date start;
private Date end;
Period(Date start, Date end) {
if (start.compareTo(end) > 0) throw new IllegExcp;
this.start = start;
this.end = end;
}
public get() {
return start;
}
}
在客户端:Date start = new Date();
Date end = new Date();
Period period = new Period(start, end);
start.set(...)
在后面set的时候,就会破话类period的约束条件
甚至:
period.get().set(..)也会修改
解决方法:1.在构造类的时候,进行参数性拷贝
2. 在返回给客户端内部变量时,进行参数拷贝
Period(Date start, Date end) {
Date innerStart = new Date(start);
Date innerEnd = new Date(end);
//在参数拷贝之后,因为若在之前,参数比较后,传入的参数在另外一个线程修改,但是参数校验已经通过
if (innerStart.compareTo(innerEnd) > 0) throw new IllegExcp;
this.start = innerStart;
this.end = innerEnd;
}
Date get() {
return new Date(this.start);
}
当然,有经验的可以传入或者传出int,long这些类型,有点理解为什么Date类型经常出现long型了
个人理解也可以用不可变类型来传入或者传入,从而保证类的约束
浙公网安备 33010602011771号