オブジェクトがあり、 equalsメソッドをオーバーライドして2つのオブジェクトを比較したいのですが、プログラムのどこにもハッシュコレクションを使用していません。このような場合、hashCodeとequalsメソッドにコントラクトがあるのはなぜですか。つまり、2つのオブジェクトが等しい場合、それらは同じハッシュコードを持つ必要があります。一般的なハッシュコードコントラクトは、このオブジェクトをハッシュを使用するコレクションのキーとして配置し、それをオーバーライドする場合に固有のものではありませんか?
3 に答える
あなた(またはもっと重要なことに、別の開発者)が将来ハッシュを使用してそれらをコレクションに入れたいかどうかわからないので、私はそう言います。これは直接的または間接的である可能性があります。つまり、オブジェクトを自分が作成したものではない別のメソッドに渡すことができ、その別のメソッドはその実装でハッシュされたコレクションを使用します。
他の人 (または次の月のあなた) があなたのクラスを再利用するかどうか確信が持てないため、これは良い習慣 (または必須) と見なされます。
たとえば、equals を必要とするオブジェクトは、キーとして使用できるように修飾されているため、ハッシュコードが必要です。
インデントやパラメーターとクラス名の大文字と小文字の区別などの慣習としてそれを見ることができますが、この種の慣習はコードの管理に役立ちます。equals メソッドを見た人は、hashcode メソッド (おそらくスーパークラス) があると当然のように想定するでしょう。彼を驚かせないでください (それが一般的なルールです)。
つまり、haschode メソッドを作成するための多くの支援ライブラリがあり、IDE のものでインスピレーションを得ることができます (たとえば、Eclipse には、equals および hashcode メソッドを生成する機能があり、非常に冗長ですが、チェックして修正した後にほとんど使用できます。 )。
を再定義する場合はequals
、 を再定義するhashCode
必要がありますが、あまり労力を費やす必要はありません。好きな番号 (8675309 など) を選択し、hashCode
メソッドにそれを返すようにします。そうすることで、オブジェクトが挿入されたときに、ハッシュされたコレクションが (遅くても) 正しく動作することが保証されます。