0

请注意此代码:

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()如果在防御性地将可变参数复制到构造函数之前完成对参数有效性的检查(即调用),我不明白这有什么关系?

4

1 回答 1

5

在并发环境中,start.getTime()并且end.getTime()可以在该构造函数中间的任何地方更改。

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

这不太可能,也不是那么大的问题,但在谨慎方面犯错是有道理的——毕竟,这就是为什么它被称为防御性编程。

于 2012-07-12T14:29:21.477 回答