为什么只在做了防御性复制后检查有效性?

时间:2012-07-12 14:26:24

标签: java

请注意以下代码:

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);

}

如果在将可变参数防御性地复制到构造函数之前检查参数的有效性(即对compareTo()的调用),我不明白这是怎么回事?

1 个答案:

答案 0 :(得分:5)

在并发环境中,start.getTime()end.getTime()可能会在该构造函数中间的任何位置发生更改。

特别是,如果首先完成检查,您可以输入通过检查,然后另一个线程使用无效值修改它们,然后防御副本复制无效值。结果:世界末日。

这不太可能,或者说这个问题很重要,但是在谨慎方面犯错是有意义的 - 毕竟,这就是为什么它被称为防御性编程。