Skip to content

[java] OverrideBothEqualsAndHashCodeOnComparable should not be required for record classes #6072

@Juneezee

Description

@Juneezee

Affects PMD Version:

7.17.0

Rule:

OverrideBothEqualsAndHashCodeOnComparable: https://docs.pmd-code.org/pmd-doc-7.17.0/pmd_rules_java_errorprone.html#overridebothequalsandhashcodeoncomparable

Description:

Record classes have their hashCode and equals methods automatically implemented.

IntelliJ IDEA’s inspection ComparableImplementedButEqualsNotOverridden does not flag record classes as violations. Since OverrideBothEqualsAndHashCodeOnComparable was originally inspired by IDEA (#5837), PMD should also exclude record classes from this rule.

Image

Reference: https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.10.3
Reference: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Record.html#equals(java.lang.Object)

Code Sample demonstrating the issue:

Adapted from https://www.jetbrains.com/help/inspectopedia/ComparableImplementedButEqualsNotOverridden.html:

record Foo(int cm) implements Comparable<Foo> {
  @Override
  public int compareTo(Foo o) {
    if (cm == o.cm) {
      return 0;
    }
    return cm < o.cm ? -1 : 1;
  }
}

class Bar implements Comparable<Bar> {
  private final int cm;

  public Bar(int cm) {
    this.cm = cm;
  }

  @Override
  public int compareTo(Bar o) {
    if (cm == o.cm) {
      return 0;
    }
    return cm < o.cm ? -1 : 1;
  }
}

Expected outcome:

OverrideBothEqualsAndHashCodeOnComparable should not be required for record classes.

Running PMD through: Gradle

Metadata

Metadata

Assignees

No one assigned

    Labels

    a:false-positivePMD flags a piece of code that is not problematic

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions