Don’t implement #equals
using just a hashCode
comparison:
class MyClass {
private final int a;
private final int b;
private final String c;
...
@Override
public boolean equals(@Nullable Object o) {
return o.hashCode() == hashCode();
}
@Override
public int hashCode() {
return Objects.hashCode(a, b, c);
}
The number of Object
s with randomly distributed hashCode
required to give a
50% chance of collision (and therefore, with this pattern, erroneously correct
equality) is only ~77k.
Suppress false positives by adding the suppression annotation @SuppressWarnings("EqualsUsingHashCode")
to the enclosing element.