2011-07-29 22 views
4

私はPositionというカスタムクラスを持っています。 -equalsをオーバーライドする必要がない場合のHashCodeのオーバーライド

Set<Position> s=new HashSet<Position>(); 

私はPositionクラスのHashCode()メソッドをオーバーライドする必要がありますか?私はequals()メソッドをオーバーライドしていません。 2つのPositionオブジェクトが同じオブジェクトである場合にのみ等しいと見なしてほしい。上記のようにHashSetを使用するには、まだHashCode()をオーバーライドする必要がありますか?

答えて

4

さまざまなオブジェクト(おそらく同じものを表す)が同じになるようにするには、hashcodeequalsをオーバーライドする必要があります。

(あなたは1を上書き行う場合は等しいとテストオブジェクトは常に同じハッシュコードを持つようにあなたは、他をオーバーライドする必要があり、明確にするため。)

1

はい! 2つのうちの1つを上書きするが、他のものを上書きしないことは非常に悪いスタイルであり、デバッグするのが難しい微妙なバグが作成されます。 Object [1]のJavaDocに文書化されている契約があり、この契約はあなたの興味のために従うべきです。これについて詳しく知りたい場合は、非常に良い本Effective Java [2]の項目7を読んでください。

編集:申し訳ありませんが、私は間違って読んでください。上書きしない場合は、何もする必要はありません。それでも、本の項目を読んでください。これらの両方の方法を実装することは常に良い考えです。

0

マップを使用している場合は、この目的のために特別に作成された、つまりキーを比較するときにオブジェクト等価の代わりに参照等価を使用するIdentityHashMapという特別なクラスがあります。

関連する問題