...
| Wiki Markup |
|---|
The general usage contract for {{equals()}} as specified by the Java Language Specification \[[JLS 2005|AA. Java References#JLSBibliography#JLS 05]\] says: |
- It is reflexive: For any reference value
x,x.equals(x)must returntrue. - It is symmetric: For any reference values
xandy,x.equals(y)must returntrueif and only ify.equals(x)returnstrue. - It is transitive: For any reference values
x,y, andz, ifx.equals(y)returnstrueandy.equals(z)returnstrue, thenx.equals(z)must returntrue. - It is consistent: For any reference values
xandy, multiple invocations ofx.equals(y)consistently returntrueor consistently returnfalse, provided no information used inequalscomparisons on the object is modified. - For any non-null reference value
x,x.equals(null)must returnfalse.
...
| Wiki Markup |
|---|
It is currently not possible to extend an instantiable class (as opposed to an {{abstract}} class) and add a value or field in the subclass while preserving the {{equals()}} contract. This implies that composition must be preferred over inheritance. This technique does qualify as a reasonable workaround \[[Bloch 2008|AA. Java References#BlochBibliography#Bloch 08]\]. It can be implemented by giving the {{XCard}} class a private {{card}} field and providing a {{public}} {{viewCard()}} method. |
...
| Wiki Markup |
|---|
"There are some classes in the Java platform libraries that do extend an instantiable class and add a value component. For example, {{java.sql.Timestamp}} extends {{java.util.Date}} and adds a nanoseconds field. The {{equals}} implementation for {{Timestamp}} does violate symmetry and can cause erratic behavior if {{Timestamp}} and {{Date}} objects are used in the same collection or are otherwise intermixed." \[[Bloch 2008|AA. Java References#BlochBibliography#Bloch 08]\] |
Risk Assessment
Violating the general contract when overriding the equals() method can lead to unexpected results.
...
| Wiki Markup |
|---|
\[[API 2006|AA. Java References#APIBibliography#API 06]\] [method equals()|http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)] \[[Bloch 2008|AA. Java References#BlochBibliography#Bloch 08]\] Item 8: Obey the general contract when overriding equals \[[Darwin 2004|AA. Java References#DarwinBibliography#Darwin 04]\] 9.2 Overriding the equals method |
...