请注意此代码:
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()
的调用)有什么关系?
最佳答案
在并发环境中,start.getTime()
和 end.getTime()
可以在该构造函数中间的任何位置进行更改。
特别是,如果首先完成检查,您可能拥有通过检查的输入,然后另一个线程用无效值修改它们,然后防御副本复制无效值。结果:世界末日。
这不太可能,也不是一个大问题,但谨慎行事是有道理的——毕竟,这就是为什么它被称为防御性编程。
关于java - 为什么只在进行防御性副本后才检查有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11454013/