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 に答える