equals メソッドのオーバーライドと新しいメソッドの作成

StackOverflow https://stackoverflow.com/questions/16557

  •  08-06-2019
  •  | 
  •  

質問

私はいつも、Java の .equals() メソッドをオーバーライドして、作成したクラスに固有のものにする必要があると考えていました。言い換えれば、同じインスタンスへの 2 つの参照ではなく、2 つの異なるインスタンスの等価性を探すことです。しかし、デフォルトのオブジェクトの動作はそのままにして、同じクラスの 2 つのオブジェクトの等価性をテストするための新しいメソッドを作成する必要があると考えているように見える他のプログラマに遭遇しました。

メソッドのオーバーライドに賛成、反対の議論は何ですか?

役に立ちましたか?

解決

標準ライブラリ クラスで等価性をテストする場合 (たとえば、java.util.Set に一意の要素が含まれていることを確認したり、オブジェクトを java.util.Map オブジェクトのキーとして使用したりするなど) を行う場合は、equals メソッドをオーバーライドする必要があります。

等号をオーバーライドする場合は、ドキュメントに記載されている API コントラクトを必ず遵守してください。たとえば、オーバーライドすることも確認してください オブジェクト.ハッシュコード:

2つのオブジェクトがequals(オブジェクト)メソッドに従って等しい場合、2つのオブジェクトのそれぞれでハッシュコードメソッドを呼び出す必要があります。同じ整数結果を生成する必要があります。

編集:私はこれをこの件に関する完全な回答として投稿しなかったので、equals のオーバーライドが最適であるという Fredrik Kalseth の声明をエコーし​​ます。 不変オブジェクト. 。APIを引用するには 地図:

注記:可変オブジェクトがマップキーとして使用される場合は、細心の注意を払う必要があります。マップの動作は、オブジェクトの値が比較に等しい方法で変更され、オブジェクトがマップ内のキーである場合に変更された場合、マップの動作は指定されていません。

他のヒント

『Effective Java』のコピーを手に取り、規定に従って項目 7 を最後まで読むことを強くお勧めします。 イコール契約. 。変更可能なオブジェクトの等号をオーバーライドする場合は注意が必要です。マップやセットなどのコレクションの多くは等価性を判断するために等号を使用し、コレクションに含まれるオブジェクトを変更すると予期しない結果が生じる可能性があります。ブライアン・ゲッツもかなり良いです equals と hashCode の実装の概要.

可変オブジェクトのequals & getHashCodeをオーバーライドすることは「決して」すべきではありません。これは.netとJavaの両方に当てはまります。そうする場合、そのようなオブジェクトを辞書などのキーとして使用すると、 変化 そのオブジェクトの場合、辞書はハッシュコードに依存してオブジェクトを検索するため、問題が発生します。

このトピックに関する良い記事は次のとおりです。 http://weblogs.asp.net/bleroy/archive/2004/12/15/316601.aspx

@デビッド・シュロスナグル 言及 ジョシュ・ブロックの言及 効果的なJava - これは 必読 すべての Java 開発者向け。

関連する問題があります:不変の値オブジェクトの場合は、オーバーライドすることも考慮する必要があります。 compare_to. 。それらが異なる場合の標準的な表現は次のとおりです。 同等の API:

一般的にはそうなりますが、厳密に (compare(x, y)==0) == (x.equals(y)) である必要はありません。一般に、この条件に違反するコンパレータは、この事実を明確に示す必要があります。推奨言語は「注:このコンパレータは、equals と矛盾する順序付けを課します。」

Equals メソッドは、参照を比較することを目的としています。したがって、動作を変更するためにオーバーライドしないでください。

必要に応じて、異なるインスタンスで等価性をテストするための新しいメソッドを作成する必要があります (または、一部の .NET クラスで CompareTo メソッドを使用します)。

正直に言うと、Java ではオーバーライドに対する議論は実際にはありません。 等しい. 。インスタンスが等しいかどうかを比較する必要がある場合は、それを実行します。

上でも述べたように、契約書については注意が必要です。 ハッシュコード, 、同様に、次の点に注意してください。 匹敵します インターフェース - ほぼすべての状況で、 自然な順序付け Comparable の定義によると、 同等との一貫性 (を参照してください。 BigDecimal 正規のカウンターの例の API ドキュメント)

同等性を判断するための新しいメソッドを作成することは、既存のライブラリ クラスを使用しないこととは別に、Java の規約に多少反することになります。

オーバーライドする必要があるのは、 equals() ソートされたデータ構造にオブジェクトを追加するときに特定の動作が必要な場合は、メソッド (SortedSet 等。)

それを行うときは、オーバーライドする必要もあります hashCode().

見る ここ 完全な説明については。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top