2016-03-28 16 views
0
例えばクラスで
public lass A { 
    private String id; 
    private String attr1; 
    private String attr2; 

    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof A)) 
      return false; 

     A a = (A) obj; 

     return new EqualsBuilder() 
       .append(id, a.id) 
       .append(attr1, a.attr1 
       .append(attr2, a.attr2) 
       .isEquals(); 
    } 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder() 
       .append(id) 
       .hashCode(); 
    } 
} 

に中継する必要があり、IDが正しく動作するのhashCode()のために最終なければなりません。
それ以外の場合は、プロパティの変更後にオブジェクトがコレクションから消失し、メモリリークが発生します。Javaのハッシュコードが最終的な変数

A a = new A(); 
a.setId("id1"); 
a.setAttr1("attr1"); 
a.setAttr2("attr2"); 

Set set = new HashSet(); 
set.add(a); 

set.contains(a) == true; 

a.setId("id2"); 

set.contains(a) == false; 

何か不足していますか?なぜHashCodeBuilder javadocに記述されていないのですか?
これは、hashCodeとequalsが同じフィールドセットでリレーする非常に多くのケースを見てきたので、私は立ち往生しました。誰もが

@Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof A)) 
      return false; 

     A a = (A) obj; 

     return new EqualsBuilder() 
       .append(id, a.id) 
       .append(attr1, a.attr1 
       .append(attr2, a.attr2) 
       .isEquals(); 
    } 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder() 
       .append(id) 
       .append(attr1) 
       .append(attr2) 
       .hashCode(); 
    } 
+1

これは、 'HashCodeBuilder'コンビニエンスクラスを使用するかどうかにかかわらず当てはまります。とにかく、これは 'hashCode'自体ではなく、' HashMap'に入れたものに対する制約です。 –

+1

Hibernateでは、マッピングされたすべてのフィールドのセッターが正しく動作する必要がありますか? 'hashCode'で使われたすべてのフィールドが' final'でなければならないのは使えないでしょう。 –

+0

これは、開発者がhashCode()で通常の変更を受ける属性を使用しないように覚えておくために、太字で文書化する必要があります。 Hibernateエンティティで実行できない場合は、他のすべての場所で可能な場合は実行する必要がありますか? –

答えて

1

...心の中で修正を属性を持つように見えるんそれはObject.hashCodeのJavadocに記述されます:

それはJavaアプリケーションの 実行中に複数回同じオブジェクトで呼び出されるたびに、 hashCodeメソッドは、 が同じ整数を返すように一貫していなければなりません。ただし、オブジェクトのequalsの比較で使用される情報は変更されません。この整数は、アプリケーションの1回の実行から同じアプリケーションの別の実行 まで一貫した のままである必要はありません。

最終的に使用されるフィールドはこれを満たします。可能でない場合は、後で値を変更しない限り、hashCodeで引き続き使用することができます。

関連する問題