0

私のチームが取り組んでいるコードには、クラス階層で定義されていないいくつかのクラスがequalsあります。次のように、 usingと一貫性のあるhashCodeものを実装したいと思います。ComparablecompareToequalshashCode

class MyClass implements Comparable<MyClass>
{
    private String myProperty;
    // Other properties, etc.
    ....

    public int compareTo(MyClass obj) {
        // Natural ordering comparisons
        ...
        // Reach here if natural ordering properties are equivalent
        return new Integer(this.hashCode()).compareTo(new Integer(obj.hashCode());
    }
}

これは実装の有効な手段と見なされComparableますか? hashCodeデフォルトの実装を使用する際に注意すべき落とし穴はありますか?

更新:私たちが目指している動作は次のとおりです。

  1. クラス プロパティは、定義した自然な順序で最初に比較されます。
  2. 2 つのオブジェクトの特定のプロパティが同等である場合、次の順序に進みます。
  3. すべてのプロパティが等しい場合、 の場合にのみ 0 を返しますthis.equals(obj)
4

2 に答える 2

0

いいえ、これは Comparable を実装する有効な手段ではありません。MyClassなぜなら、inside メソッドの 2つの異なるオブジェクトのすべての自然な順序比較equalsが真になると仮定すると、その後、2 つのオブジェクトのハッシュコードが比較されると、それが返されるからfalseです。これは、この場合、クラスhashcodeのメソッドがObjectデフォルトで呼び出されるためです (独自のハッシュコード メソッドを提供していないため)。これはオブジェクトごとに異なります。したがって、MyClass の 2 つのオブジェクトは、すべての自然順序比較がtrue.

于 2013-03-29T16:25:35.823 に答える
0

はい、これは有効な方法です。どうやら、他の値と等しいオブジェクトの固定順序が必要なようです(そうですか?ここでハッシュコードの使用法で目的を説明していませんでした)。私がする唯一のことは、compareTo メソッドで Integer.compareTo() の Java コードをコピーすることです。そのため、比較ごとに 2 つの整数を作成する必要はありません。

于 2013-03-29T16:26:47.597 に答える