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();
}
これは、 'HashCodeBuilder'コンビニエンスクラスを使用するかどうかにかかわらず当てはまります。とにかく、これは 'hashCode'自体ではなく、' HashMap'に入れたものに対する制約です。 –
Hibernateでは、マッピングされたすべてのフィールドのセッターが正しく動作する必要がありますか? 'hashCode'で使われたすべてのフィールドが' final'でなければならないのは使えないでしょう。 –
これは、開発者がhashCode()で通常の変更を受ける属性を使用しないように覚えておくために、太字で文書化する必要があります。 Hibernateエンティティで実行できない場合は、他のすべての場所で可能な場合は実行する必要がありますか? –