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

Inq*_*ive 0 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);
Run Code Online (Sandbox Code Playgroud)

}

我不知道compareTo()在防御性地将可变参数复制到构造函数之前检查参数的有效性(即调用)是否重要?

Lou*_*man 5

在并发环境中,start.getTime()并且end.getTime()可以在构造函数中的中间的任何地方发生变化.

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

这不太可能,或者说是一个大问题,但是谨慎的做法是错误的 - 毕竟,为什么它被称为防御性编程.