public class EqualsTester
extends junit.framework.Assert
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);
| Constructor and Description |
|---|
EqualsTester(java.lang.Object a,
java.lang.Object b,
java.lang.Object c,
java.lang.Object d)
Perform the test.
|
| Modifier and Type | Method and Description |
|---|---|
private void |
assertAEqualsA(java.lang.Object a) |
private void |
assertAEqualsB(java.lang.Object a,
java.lang.Object b) |
private void |
assertAEqualsNull(java.lang.Object a) |
private void |
assertANotEqualC(java.lang.Object a,
java.lang.Object c) |
private void |
assertCAllowedToBeNull(java.lang.Class clazz)
C may not be null if it has a public non-default constructor or any
setXX() methods
|
private void |
assertClassAndSubclass(java.lang.Object a,
java.lang.Object d) |
private void |
assertDDifferentClassThanA(java.lang.Object a,
java.lang.Object d) |
private void |
assertNotNull(java.lang.Object object,
java.lang.String description) |
private void |
assertNull(java.lang.Object object,
java.lang.String description) |
private void |
assertSameClassAsA(java.lang.Object a,
java.lang.Object object,
java.lang.String name) |
private boolean |
isClassFinal(java.lang.Class clazz) |
assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame, formatpublic EqualsTester(java.lang.Object a,
java.lang.Object b,
java.lang.Object c,
java.lang.Object d)
a - The object to be testedb - An object that is equal to Ac - An object of the same class that is not equal to A. If it is
not possible to create a different one then pass null.d - A subclass of A with the same values. If A is an instance of a
final class then this must be nullprivate boolean isClassFinal(java.lang.Class clazz)
private void assertAEqualsA(java.lang.Object a)
private void assertAEqualsB(java.lang.Object a,
java.lang.Object b)
private void assertANotEqualC(java.lang.Object a,
java.lang.Object c)
private void assertClassAndSubclass(java.lang.Object a,
java.lang.Object d)
private void assertNotNull(java.lang.Object object,
java.lang.String description)
private void assertNull(java.lang.Object object,
java.lang.String description)
private void assertCAllowedToBeNull(java.lang.Class clazz)
clazz - private void assertSameClassAsA(java.lang.Object a,
java.lang.Object object,
java.lang.String name)
private void assertDDifferentClassThanA(java.lang.Object a,
java.lang.Object d)
private void assertAEqualsNull(java.lang.Object a)