...
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
x
andy
,x.equals(y)
must returntrue
if and only ify.equals(x)
returnstrue
. - It is transitive: For any reference values
x
,y
, andz
, ifx.equals(y)
returnstrue
andy.equals(z)
returnstrue
, thenx.equals(z)
must returntrue
. - It is consistent: For any reference values
x
andy
, multiple invocations ofx.equals(y)
consistently returntrue
or consistently returnfalse
, provided no information used inequals
comparisons 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 |
...