それぞれCommonsのReflectionToStringBuilder, EqualsBuilder, HashCodeBuilderを使うとシンプルに書けます。こんな便利なライブラリがあったのですか!あやうく車輪の再発明をしちゃうところでした。
以下にテンプレートを載せておきます。EqualsBuilderでプロパティ値をappendするときは"インスタンス毎にユニークなプロパティ"からappendしていった方がパフォーマンスが向上します(下の例ならlastName, firstName, birthday, ageの順)。値の分散が同程度のプロパティであれば、比較処理が軽いものからappendするのがよさそうです。
package com.kenjih.roo; import java.util.Date; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; public class Customer { private String firstName; private String lastName; private int age; private Date birthday; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } @Override public boolean equals(Object obj) { if (!(obj instanceof Customer)) { return false; } if (this == obj) { return true; } Customer rhs = (Customer) obj; return new EqualsBuilder().append(age, rhs.age) .append(birthday, rhs.birthday) .append(firstName, rhs.firstName) .append(lastName, rhs.lastName).isEquals(); } @Override public int hashCode() { return new HashCodeBuilder().append(age).append(birthday) .append(firstName).append(lastName).toHashCode(); } }
0 件のコメント:
コメントを投稿