78 lines
1.9 KiB
Plaintext
78 lines
1.9 KiB
Plaintext
== Why is this an issue?
|
|
|
|
According to the Java Language Specification, there is a contract between ``++equals(Object)++`` and ``++hashCode()++``:
|
|
|
|
|
|
____
|
|
If two objects are equal according to the ``++equals(Object)++`` method, then calling the ``++hashCode++`` method on each of the two objects must produce the same integer result.
|
|
|
|
It is not required that if two objects are unequal according to the ``++equals(java.lang.Object)++`` method, then calling the ``++hashCode++`` method on each of the two objects must produce distinct integer results.
|
|
|
|
However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
|
|
|
|
____
|
|
|
|
In order to comply with this contract, those methods should be either both inherited, or both overridden.
|
|
|
|
== How to fix it
|
|
|
|
=== Code examples
|
|
|
|
==== Noncompliant code example
|
|
|
|
[source,java,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
class MyClass { // Noncompliant - should also override "hashCode()"
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
/* ... */
|
|
}
|
|
|
|
}
|
|
----
|
|
|
|
==== Compliant solution
|
|
|
|
[source,java,diff-id=1,diff-type=compliant]
|
|
----
|
|
class MyClass { // Compliant
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
/* ... */
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
/* ... */
|
|
}
|
|
|
|
}
|
|
----
|
|
|
|
|
|
== Resources
|
|
|
|
* CWE - https://cwe.mitre.org/data/definitions/581[CWE-581 - Object Model Violation: Just One of Equals and Hashcode Defined]
|
|
* https://wiki.sei.cmu.edu/confluence/x/7DVGBQ[CERT, MET09-J.] - Classes that define an equals() method must also define a hashCode() method
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
This [enum|class] overrides "hashCode()|equals()" and should therefore also override "hashCode()|equals()".
|
|
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|