
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
62 lines
1.4 KiB
Plaintext
62 lines
1.4 KiB
Plaintext
== Why is this an issue?
|
|
|
|
According to the Java ``++Comparable.compareTo(T o)++`` documentation:
|
|
|
|
|
|
____
|
|
It is strongly recommended, but not strictly required that ``++(x.compareTo(y)==0) == (x.equals(y))++``.
|
|
|
|
Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact.
|
|
|
|
The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."
|
|
|
|
____
|
|
|
|
If this rule is violated, weird and unpredictable failures can occur.
|
|
|
|
For example, in Java 5 the ``++PriorityQueue.remove()++`` method relied on ``++compareTo()++``, but since Java 6 it has relied on ``++equals()++``.
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,java]
|
|
----
|
|
public class Foo implements Comparable<Foo> {
|
|
@Override
|
|
public int compareTo(Foo foo) { /* ... */ } // Noncompliant as the equals(Object obj) method is not overridden
|
|
}
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,java]
|
|
----
|
|
public class Foo implements Comparable<Foo> {
|
|
@Override
|
|
public int compareTo(Foo foo) { /* ... */ } // Compliant
|
|
|
|
@Override
|
|
public boolean equals(Object obj) { /* ... */ }
|
|
}
|
|
----
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
Override "equals(Object obj)" to comply with the contract of the "compareTo(T o)" method
|
|
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|