2011-11-23 6 views
22

恐らく疑わしい質問ですが、私はこれを台無しにしたくありません。たとえば、私が2つのJavaクラス、Class1Class2を持っているとしましょう。ここではClass2 extends Class1です。両方のクラスでGuavaを使用してObject.hashcode()をオーバーライドしたいと思います。スーパークラスのために、私はクラス2の場合Guava Objects.hashcode()の実装にスーパークラスを組み込む正しい方法は?

@Override 
public int hashCode() { 
    return Objects.hashcode(mField1, mField2); 
} 

を持っている、考慮のClass1のメンバーをとる)(ハッシュコードを実装するための正しい方法は何ですか?それはこれのようなものですか?

@Override 
public int hashcode() { 
    return Objects.hashcode(super.hashcode(), mField3, mField4); 
} 

私には分かりますが、いくつかの検証が必要です。 Joshua BlochはEffective Javaのこの状況に対処しておらず、Guavaのドキュメントもそうではありません。

+0

完全に合理的な実装は、(。推論同じ論法は、hashCode()メソッドに適用されます)バグを特定するにはsuper.hashCode()に依存しないでください。 –

+0

皆様に感謝しております。私の場合、Class1とClass2のインスタンス間の平等性をテストする必要はありませんが、以下の点は理解して理解しておくのが良いことです。 –

答えて

13

はい、正しく表示されます。 Objects.hashCode(f1, f2, f3, f4)があれば同じです。実装を見ると、それはresult += 31 * result + hashcodeOfCurrentObjectのようなものです。つまり、あなたの結果は、正確にではないが、問題ではない、31 +スーパーハッシュコードになります。あなたがそれを行うべきではないと言って

@Override 
public int hashCode() { 
    return Objects.hashcode(mField1, getParentField1(), getParentField2()); 
} 
0

は、私はこのアプローチを好みます。アイテム8:

これは、オブジェクト指向言語における等価性の基本的な問題であることが分かりました。 インスタンス化可能なクラスを拡張し、 オブジェクト指向抽象化の利点を享受しない限り、 等しい契約を維持しながら値コンポーネントを追加する方法はありません。

: - それは間違いである(パフォーマンスクラス2のインスタンスの平等は、同様のClass1のフィールドに基づいている場合

+2

しかし、親クラスのハッシュコード計算が変更された場合、サブクラスのハッシュコードは変更を反映しません。スーパークラスのハッシュコードは、サブクラスがアクセスできないプライベートフィールドを使用する可能性もあります。 – ColinD

+0

@ColinD私は知っています。このバージョンは、あなたがスーパークラスを知っていて、スーパークラスにアクセスできる場合にのみ意味があります。 –

+0

私はこのアプローチの利点が分かりません。あなたはそれを好む理由を説明できますか?下位は、サブクラスがスーパークラスのフィールドを追跡しなければならないようになっているように思われます。これはメンテナンス上の面倒なことです。 –

10

効果的なJavaは、この状況に対処ん...:Bozhoの提案が有効であるが、

+0

No. hashCode()はバイナリリレーションではないので、スクリューが階層に対して等しくなるプロパティである「対称」である必要はありません。私はClass1のインスタンスがClass2のインスタンスに等しいことを暗示する質問に何も言及していません.EJで扱われる問題です.. –

+0

どちらの質問からも明らかではないので、少なくとも私はこのケースをカバーしようと考えていました。 –

+2

しかし、x.equals(y)ならば、x.hashCode()は契約上、y.hashCode()に等しくなることが義務付けられています。* Class1のインスタンスがClass2のインスタンスと等しくなるようにしたい場合は、少なくとも異なるクラスのインスタンスが等しい場合、hashCode()の実装が一貫している必要があります。 –

関連する問題