compareTo() メソッドと java.util.Comparator.compare() を実装しているメソッドでの減算を報告します。
整数減算の結果を compareTo() メソッドの結果として使用するのは一般的な用法ですが、このコンストラクトは整数がオーバーフローした場合に検出しにくく厄介なバグを引き起こす可能性があります。
ほとんどの場合は、整数値を直接比較して -1、0、1 のいずれかを返すことをお勧めします。
即座に整数型にキャストされている浮動小数点値の減算も報告されます。このような場合は数値が丸められることで、精度が低下する可能性があるためです。
このインスペクションは、値の範囲が制限されており、オーバーフローが絶対に発生しないことが静的に判断される場合は報告しません。
また、0 以上の int 数値の減算がオーバーフローすることはありません。
したがって、このインスペクションはそのような場合には警告しないようになっています。
常にゼロ以上を返すメソッドは、javax.annotation.Nonnegative アノテーションを付けるか、このインスペクションのオプションで指定できます。
例:
class DoubleHolder implements Comparable<DoubleHolder> {
double d;
public int compareTo(DoubleHolder that) {
return (int)(this.d - that.d);
}
}
マイナスにならないことが分かっている String.length() を使用した例。この場合は警告が表示されません。
class A implements Comparable<A> {
final String s = "";
public int compareTo(A a) {
return s.length() - a.s.length();
}
}
減算内で安全に使用できるメソッドをリストするには、オプションを使用します。
メソッドは、常に 0 以上の int 値を返す場合は安全です。