編集:問題の核心
従来の equals メソッドの残りの部分が失敗するのはいつで、Identity Test はいつ合格するのでしょうか? これは、余分な作業の時間を節約するためだけに追加されたものですか?
元の投稿
テスト中のクラスでorg.apache.commons.lang3.builder.CompareToBuilderのCompareToBuilderを利用しています。EqualsBuilderでは、equals ビルダーを呼び出す前に、次のコードを明示的に呼び出す必要があることに気付きました。
if (obj == this) { return true; } // Identity test
このようなロジックは、Eclipse の自動生成された equals メソッドにも表示されます。メソッドでメソッドを呼び出し、同等性を 0 にテストするだけで、 DRY方法論を使用しようとしています。equals
compareTo
1 つの質問は、上記のコードを equals メソッドに含める必要があるか、それを compareTo メソッドに追加する必要があるか、またはCompareToBuilderで既にカバーされているかどうかです。CompareToBuilderは、渡されたパラメーターの等価性をチェックしますが、元の lhs (this) および rhs (Object obj) への直接参照を受け取っていないことに気付きました。これは、私のcompareToメソッドで修正すべき見落としだと思います。
私の最大の問題は、潜在的なテストケースを考案できないように見えることですobj == this
が、this.compareTo(obj) != 0
. this
頭に浮かぶ唯一のことは、不適切に実装されたcompareToにあります。インスタンス変数nullの1つでobjを送信すると、対応する変数inもnullかどうかを最初にチェックしないと、ゼロ以外の数値が返される可能性があります。(昨日これに遭遇しました)。
サンプル equals メソッド:
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof MyClass)
return this.compareTo((MyClass)obj) == 0;
return false;
}
サンプル compareTo メソッド
@Override
public int compareTo(MyClass other) {
return new CompareToBuilder()
.append(this.getParam1(), other.getParam1())
.append(this.getParam2(), other.getParam2())
.toComparison();
}