自動化されたhashCode()およびequals()の
問題:hashCode()およびequals()メソッド
ソリューションを自動的に実装する必要がある場合:EqualsBuilderを
使用し、HashCodeBuilderで例を使用します。
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
public class PoliticalCandidate {
// Member variables - omitted for brevity
// Constructors - omitted for brevity
// get/set methods - omitted for brevity
// A hashCode which creates a hash from the two unique identifiers
public int hashCode( ) {
return new HashCodeBuilder(17, 37)
.append(firstName)
.append(lastName).toHashCode( );
}
// An equals which compares two unique identifiers
public boolean equals(Object o) {
boolean equals = false;
if ( o != null &&PoliticalCandidate.class.isAssignableFrom(o) ) {
PoliticalCandidate pc = (PoliticalCandidate) o;
equals = (new EqualsBuilder( )
.append(firstName, ps.firstName)
.append(lastName, ps.lastName)).isEquals( );
}
return equals;
}
}
ディスカッション:
1.上記の例では、firstnameとlastnameが同じ場合、2つのオブジェクトのhashCodeは同じであるため、equals()はtrueを返します
。hashCodeがクラスのすべてのフィールドに依存している場合は、リフレクションメカニズムを使用して、 hashCode。
public int hashCode( ) {
return HashCodeBuilder.reflectionHashCode(this);
}
ToStringBuilderやHashCodeBuilderと同様に、EqualsBuilderも設定にappend()メソッドを使用します。EqualsBuilderのappend()メソッドは、基本的な型、オブジェクト、配列をパラメーターとして受け入れることができます。EqualsBuilderの優れた点は、配列をパラメーターとしてappend()メソッドに直接渡すことができることです。EqualsBuilderは、配列内の各要素を順番に比較します。
2.各属性値が等しい場合に限り、2つのオブジェクトが等しい場合、この文は次のコードで実現できます。
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}