EqualsBuilderの説明(google翻訳)
Object.equals(Object)メソッドの実装を支援します。
このクラスは、任意のクラスに対して良好なequalsメソッドを構築するメソッドを提供します。 Joshua BlochによるEffective Javaのルールに従います。特に、倍精度、浮動小数点数、および配列を比較するための規則は扱いにくいことがあります。また、equals()とhashCode()が一貫していることを確認することは困難です。
equalsと比較する2つのオブジェクトは同じハッシュコードを生成する必要がありますが、同じハッシュコードを持つ2つのオブジェクトは等しくなくてもかまいません。
関連するすべてのフィールドは、等価の計算に含める必要があります。派生フィールドは無視されます。特に、ハッシュコードの生成に使用されるフィールドは、equalsメソッドで使用する必要があり、その逆もあります。
コードの一般的な使用方法は次のとおりです。
public boolean equals(Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) {
return false;
}
MyClass rhs = (MyClass) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(field1, rhs.field1)
.append(field2, rhs.field2)
.append(field3, rhs.field3)
.isEquals();
}あるいは、リフレクションを使用してテストするフィールドを決定する方法があります。これらのフィールドは通常非公開であるため、reflectionEqualsメソッドはAccessibleObject.setAccessibleを使用してフィールドの可視性を変更します。適切な権限が正しく設定されていない限り、セキュリティマネージャの下では失敗します。明示的にテストするよりも遅くなります。非プリミティブなフィールドは、equals()を使用して比較されます。
このメソッドの典型的な呼び出しは次のようになります。
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}EqualsExcludeアノテーションを使用して、reflectionEqualsメソッドでフィールドが使用されないようにすることができます。
Object#equalsをオーバーライドする際の補助メソッドになります。
いちいち書くのが面倒なあなた向けのおすすめのソリューションです。
EqualsBuilder
package jp.pjin.tech.java; import jp.pjin.tech.java.domain.Cat; public class CommonsExample16 { public static void main(String[] args) throws Exception { Cat c1 = new Cat(); c1.setId(1); c1.setName("タマ"); c1.setType("みけ"); Cat c2 = new Cat(); c2.setId(2); c2.setName("タマ"); c2.setType("みけ"); if(c1 == c2){ System.out.println("ref true"); }else{ System.out.println("ref false"); } if(c1.equals(c2)){ System.out.println("equals true"); }else{ System.out.println("equals false"); } } }
Cat
package jp.pjin.tech.java.domain; import java.io.Serializable; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.EqualsExclude; public class Cat implements Serializable { private static final long serialVersionUID = 1L; @EqualsExclude private int id; private String name; private String type; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } }
Catクラスのequals部分に実装しました。
@Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (!(obj instanceof Cat)) { return false; } Cat rhs = (Cat) obj; return new EqualsBuilder() // .append(id, rhs.id) .append(name, rhs.name) .append(type, rhs.type) .isEquals(); }
上記のように書いても同様な結果が得られます。ちょっと長いですが、通常このような書き方がをしていると思います。
それを何と1行で!素晴らし。素晴らしすぎます。
また、今回はidを比較の対象から外しているのですが、その時はフィールドにアノテーション(@EqualsExclude)を付けるだけで除外できます。
いちいち書くのが面倒だったものがスッキリ爽快です。

Java apache commons StrSubstitutor サンプルプログラム

Java apache commons StrMatcher サンプルプログラム

Java apache commons StrLookup サンプルプログラム

Java apache commons StrBuilder サンプルプログラム

Java apache commons ExtendedMessageFormat サンプルプログラム

Java apache commons MethodUtils サンプルプログラム

Java apache commons InheritanceUtils サンプルプログラム

Java apache commons FieldUtils サンプルプログラム

Java apache commons ConstructorUtils サンプルプログラム
