java - 为什么只在进行防御性副本后才检查有效性?

标签 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() 的调用)有什么关系?

最佳答案

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

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

这不太可能,也不是一个大问题,但谨慎行事是有道理的——毕竟,这就是为什么它被称为防御性编程。

关于java - 为什么只在进行防御性副本后才检查有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11454013/

相关文章:

java - JFrame 中的并行可见 JPanel

java - Java 中的空值和指针

java - 关闭 Android 模拟器后 OpenJDK 继续运行

java - 键盘快捷键在初始化时仅工作一次?

java - 有没有一种简单的方法来检查 mp4 文件是否有效?

java - 立即获得命令提示符输出?

java - imageview android的无限动画

java - 使用 BufferedReader 读取多个文件(使用 String[] args)

JavaFX:在 TableView 的开头添加行

java - 如何使用用户在输入框中输入的数字的平方根,而不是数字本身?