This class provides methods to build a good equals method for any
class. It follows rules laid out in
Effective Java
, by Joshua Bloch. In particular the rule for comparing doubles,
floats, and arrays can be tricky. Also, making sure that
equals() and hashCode() are consistent can be
difficult.
Two Objects that compare as equals must generate the same hash code,
but two Objects with the same hash code do not have to be equal.
All relevant fields should be included in the calculation of equals.
Derived fields may be ignored. In particular, any field used in
generating a hash code must be used in the equals method, and vice
versa.
Typical use for the code is as follows:
public boolean equals(Object obj) {
if (obj instanceof MyClass == false) {
return false;
}
if (this == obj) {
return true;
}
MyClass rhs = (MyClass) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(field1, rhs.field1)
.append(field2, rhs.field2)
.append(field3, rhs.field3)
.isEquals();
}
Alternatively, there is a method that uses reflection to determine
the fields to test. Because these fields are usually private, the method,
reflectionEquals, uses AccessibleObject.setAccessible to
change the visibility of the fields. This will fail under a security
manager, unless the appropriate permissions are set up correctly. It is
also slower than testing explicitly.
A typical invocation for this method would look like:
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
Assists in implementing equals(Object) methods.
This class provides methods to build a good equals method for any class. It follows rules laid out in Effective Java , by Joshua Bloch. In particular the rule for comparing
doubles,floats, and arrays can be tricky. Also, making sure thatequals()andhashCode()are consistent can be difficult.Two Objects that compare as equals must generate the same hash code, but two Objects with the same hash code do not have to be equal.
All relevant fields should be included in the calculation of equals. Derived fields may be ignored. In particular, any field used in generating a hash code must be used in the equals method, and vice versa.
Typical use for the code is as follows:
public boolean equals(Object obj) { if (obj instanceof MyClass == false) { return false; } if (this == obj) { return true; } MyClass rhs = (MyClass) obj; return new EqualsBuilder() .appendSuper(super.equals(obj)) .append(field1, rhs.field1) .append(field2, rhs.field2) .append(field3, rhs.field3) .isEquals(); }Alternatively, there is a method that uses reflection to determine the fields to test. Because these fields are usually private, the method,
reflectionEquals, usesAccessibleObject.setAccessibleto change the visibility of the fields. This will fail under a security manager, unless the appropriate permissions are set up correctly. It is also slower than testing explicitly.A typical invocation for this method would look like:
public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); }