-1

私は、同一性比較(2つの参照が同じか)と等価比較(両方のオブジェクトに同じデータが含まれているか)の両方が必要なJavaプロジェクトを持っています。
私の解決策は、equals/hashcode をオーバーライドせず、オブジェクトに isEqual メソッドを追加することです。
この状況に対処するためのより良いパターンはありますか?

編集:
これは、この特定の必要性に関する詳細情報です。

デフォルトでは、次のものがあります。

  • equals身元チェックの実行 (==)
  • containsの観点から実装されているequalsため、 == を使用

しかし、私の使用法では、次のことが必要です。

  • equals等価性チェックを実行する (オブジェクトに同じデータが含まれている)
  • contains== で実装されたままにする

両方を同時に持つことはできないため、1 つの解決策は、独自の等価チェックを実装して、次のようにすることです。

  • contains==を使用して同じまま
  • isEqual代わりに実装して使用するequals

別の解決策は、== を使用する独自のコンテンツを実装することです。

  • customContains== を使用して実装し、代わりに使用するcontains
  • equalsオブジェクトに同じデータが含まれているかどうかを確認するためのオーバーライド

どれが最高ですか?これを行う別のより良い方法はありますか?

4

2 に答える 2

7

メソッドをオーバーライドしてequals()、オブジェクトに同じデータが含まれているかどうかを判断します。

==それらが同じオブジェクト、つまり同じ参照であるかどうかを判断するために使用します。

于 2012-12-20T17:22:44.237 に答える
3

これを行うための最良のパターンは、言語の仕様に従うことです。equals と hashcode をオーバーライドし、あなた自身の equals をロールバックしない限り、これは大きな問題です。

と呼ばれる関数でそれらをラップしたい場合isEqual、つまり hashcode および equals メソッド、これは別のアプローチですが、それでも equals および hashcode をオーバーライドしていることを意味します。

isEqual基本的に、あなたがしていることは、非常に厳格で壊れた API を作成することです。これは、関数が非常に非決定論的である可能性があるため、利用するのが難しいため、あまり使用されません。

于 2012-12-20T17:23:01.677 に答える