比較可能な(等しいと一致する)フィールドと比較できないフィールド(オーバーライドするかどうかがわからないクラスの)を持つクラスを考えてみますObject#equals
。
クラスのインスタンスが比較され、結果の順序は等しいと一致する必要があります。つまり、両方のフィールドが(のように)等しく、比較可能なフィールドの順序と一致する場合に0
返されます。Object#equals
私はSystem.identityHashCode
これらの要件でカバーされていないほとんどのケースをカバーしていました(同じ比較可能であるが、他の値が異なるインスタンスの順序は任意です)が、これが最善のアプローチであるかどうかはわかりません。
public class MyClass implements Comparable<MyClass> {
private Integer intField;
private Object nonCompField;
public int compareTo(MyClass other) {
int intFieldComp = this.intField.compareTo(other.intField);
if (intFieldComp != 0)
return intFieldComp;
if (this.nonCompField.equals(other.nonCompField))
return 0;
// ...and now? My current approach:
if (Systems.identityHashCode(this.nonCompField) < Systems.identityHashCode(other.nonCompField))
return -1;
else
return 1;
}
}
私がここで見る2つの問題:
- 2つのオブジェクトでが同じである場合
Systems.identityHashCode
、それぞれが他方よりも大きくなります。(これはまったく起こり得ますか?) - 私が何をしているのかを理解している限り、同じ
intField
値と異なる値を持つインスタンスの順序は、プログラムの実行間で一貫している必要はありません。nonCompField
Systems.identityHashCode
あれは正しいですか?もっと問題がありますか?最も重要なことは、これを回避する方法はありますか?