87 lines
1.6 KiB
Plaintext
87 lines
1.6 KiB
Plaintext
"equals" as a method name should be used exclusively to override ``++Object.equals(Object)++`` to prevent any confusion.
|
|
|
|
|
|
It is tempting to overload the method to take a specific class instead of ``++Object++`` as parameter, to save the class comparison check. However, this will not work as expected when that is the only override.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
[source,java]
|
|
----
|
|
class MyClass {
|
|
private int foo = 1;
|
|
|
|
public boolean equals(MyClass o) { // Noncompliant; does not override Object.equals(Object)
|
|
return o != null && o.foo == this.foo;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
MyClass o1 = new MyClass();
|
|
Object o2 = new MyClass();
|
|
System.out.println(o1.equals(o2)); // Prints "false" because o2 an Object not a MyClass
|
|
}
|
|
}
|
|
|
|
class MyClass2 {
|
|
public boolean equals(MyClass2 o) { // Ignored; `boolean equals(Object)` also present
|
|
//..
|
|
}
|
|
|
|
public boolean equals(Object o) {
|
|
//...
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
[source,java]
|
|
----
|
|
class MyClass {
|
|
private int foo = 1;
|
|
|
|
@Override
|
|
public boolean equals(Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
}
|
|
if (o == null || getClass() != o.getClass()) {
|
|
return false;
|
|
}
|
|
|
|
MyClass other = (MyClass)o;
|
|
return this.foo == other.foo;
|
|
}
|
|
|
|
/* ... */
|
|
}
|
|
|
|
class MyClass2 {
|
|
public boolean equals(MyClass2 o) {
|
|
//..
|
|
}
|
|
|
|
public boolean equals(Object o) {
|
|
//...
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|