EqualsTester is used to test the equals contract on objects. The contract as
specified by java.lang.Object states that if A.equals(B) is true then
B.equals(A) is also true. It also specifies that if A.equals(B) is true then
A.hashCode() will equals B.hashCode().
It is also common practice to implement equals using an instanceof check
which will result in false positives in some cases. Specifically, it will
result in false positives when comparing against a subclass with the same
values. For an in-depth discussion of the common problems when implementing
the equals contract, refer to the book "Practical Java" by Peter Haggar
// WRONG way of implementing equals
public boolean equals( final Object object ) {
if( object instanceof this ) {
// do check
}
return false;
}
The correct way to implement equals is as follows
public boolean equals(final Object object) {
if (object != null && object.getClass() == this.getClass()) {
// do check
}
return false;
}
EqualsTester ensures that the equals() and hashCode() methods have been
implemented correctly.
final Object a = new Foo(4); // original object
final Object b = new Foo(4); // another object that has the same values as the original
final Object c = new Foo(5); // another object with different values
final Object d = new Foo(4) {
}; // a subclass of Foo with the same values as the original
new EqualsTester(a, b, c, d);
author: Daniel Wiese |