2017-05-26 15 views
1

私は、アサーションが.equalsメソッドを呼び出すユニットテストプロジェクトに取り組んでいます。しかし、以前のプロジェクトの人々はこれらの方法を生成しませんでした。すべてのクラスは.equalsメソッドと.hashcodeメソッドを持つべきですか?

コード作成時にこれらのメソッドを自動生成することをお勧めしますか?すべてのコーダーがこれをしなければならないのでしょうか?

私は、.equalsメソッドと.hashcodeメソッドの詳細を検索していましたが、そのほとんどは実装またはオーバーライド方法に合わせているようです。

+5

クラスの目的によって異なります。多くのクラスでは、 'Object'から継承した' equals'メソッドと 'hashCode'メソッドによって実装された" identity "はうまくいきます。 – Henry

+0

これらの型のオブジェクトを比較する必要がある場合は、 'equals'と' hashCode'をオーバーライドする必要があります。また、オブジェクトをハッシュマップに入れるときに 'hashCode'をオーバーライドする必要があります。通常、1つがオーバーライドされると、他のものもオーバーライドされます。 – SomeDude

+1

'equals'メソッドを*自動生成するのは良い方法ではありません。いくつかのクラスは、それらの状態フィールドのすべてによってそのアイデンティティを論理的に定義しているクラスはほとんどありません。自動生成された 'equals'メソッドが行うものと仮定します。インスタンスが等しいかどうかをチェックする場合は、分かりやすい 'equals'メソッドと' hashCode'メソッドを手作業で記述します。 – VGR

答えて

2

それはほとんど味の質問です - あなたはequalsメソッドを使用することを期待していない場合、それは意味の書き込み、(たとえば、assertEqualsを使用していないが、Mapでキーなどとして、このクラスを使用する意味はありません)あなたはデッドコードを書いているかもしれませんし、いくつかの規則はそれを避けることを主張します。

assertEqualsを使用する場合は、equalsメソッドが実装されている必要があります。実装しようとするならば、おそらく見つけにくい、見つけにくいバグに対してコードを証明するためにhashCodeを実装するべきでしょう。

+2

OPのテストでのアサーションの期待は、クラスが 'Object'から継承した' equals() '実装と一致しないと思われます。これが事実であるという疑問から私には分かりません。 –

+1

"assertEqualsを使用する場合は、equalsメソッドを実装する必要があります。それはなぜでしょうか? 'equals'がアイデンティティをチェックし、したがってオーバーライドされないと期待されるならば、' assertEquals'を使用することができます。 – Kapep

+0

「味覚の問題」ではありません。 「味」はそれとは全く関係ありません。それは無効なアドバイスです。それはセマンティクスの問題であり、エンジニアリングの原則によって完全に決定されます。確かに「味」と漠然としていないものはまったくありません。 –

0

これらのメソッドを自動生成すると、標準的な実装が行われます。 1つの標準実装は、オブジェクト:リンクとネイティブハッシュコード計算の比較でコード化されています。 プロジェクト内のすべてのエンティティに標準で実装されている他の実装を想像できない場合は、equalsとハッシュコードを自動生成しません。将来の比較条件がすべて分かったら手動で実装してください。