2011-10-18 6 views
6

オブジェクトのフィールドの一部だけが実際の状態を表している場合、私はequalshashCodeをオーバーライドするとき、これらは...equals/hashCodeのいくつかのフィールドを無視すると潜在的な落とし穴ですか?

を無視することができたと私はこのかかわらず、不安感を得る、とお聞きしたかった、

  1. これは一般的な方法ですか?
  2. この方法には潜在的な落とし穴がありますか?
  3. equals/hashCodeの一部のフィールドを無視することに関するドキュメントやガイドラインはありますか?私の特定の状況で

、私は、問題の状態空間を探索しています。私は訪問された州のハッシュセットを維持したいと思いますが、の州につながる道も含めることを検討しています。明らかに、2つの状態は異なるパスで見つかっても同じです。

答えて

3

これは、特定のオブジェクトの一意性をどのように考えるかに基づいています。主キー(ユニークキー)がある場合は、その属性のみを使用するだけで十分です。

一意性が10の異なる属性の組み合わせであると考える場合は、等価の10の属性すべてを使用します。

同じオブジェクトが同じハッシュコードを生成する必要があるため、equalsで使用した属性だけを使用してハッシュコードを生成します。

等号とハッシュコードの属性を選択すると、指定したオブジェクトの一意性をどのように定義するかが決まります。

  • これは一般的なプラクティスですか?はい

  • この方法には潜在的な落とし穴がありますか?いいえ

  • equals/hashCodeの一部のフィールドを無視することに関するドキュメントやガイドラインはありますか?

    "Objectクラスのequalsメソッドは、オブジェクト上で最も差別的な 可能同値関係を実装しています。

これは、オブジェクトクラスのJavadocからです。しかし、クラスの作成者として、一意性がどのように定義されているかを知っています。

+0

あなたが言及したように、あなたはequalsまたはhashCode()に "path"を含めません。 –

+0

私はこの答えが好きですが、あなたの質問は避けてください:-) – aioobe

+0

あなたの質問に答えました。 –

2

最終的には、「等しい」は、それが意味するものを意味します。 「等しい」値は同じハッシュコードを返さなければならないという制約があります。もちろん、2つの同一のアドレス「等価」がtrueを返す必要があります。しかし、たとえば、2つのWebページの内容を比較して(nonceの再現性の問題を無視して)、「URL」が異なっていても、ページの内容が一致している場合は「等しい」と言うことができます方法。

0

Objectのメソッドをオーバーライドするために私が見た最良のドキュメント/ガイドラインは、Josh BlochのEffective Javaでした。 「すべてのオブジェクトに共通のメソッド」には、「equalsをオーバーライドするときの一般契約に従う」と「equalsをオーバーライドするときに常にhashCodeをオーバーライドする」というセクションが含まれています。この2つの方法をオーバーライドするときに考慮すべき事項について詳しく説明します。私は答えを直接放棄しないでしょう。この本は、すべてのJava開発者のコ​​ストに相当するはずです。

関連する問題