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型了

 

个人理解也可以用不可变类型来传入或者传入,从而保证类的约束

posted on 2015-11-08 14:16  jsy306  阅读(147)  评论(0)    收藏  举报

导航