In records, the default behavior of the equals()
method is to check the equality by field values. This works well for primitive fields
or fields, whose type overrides equals()
, but this behavior doesn’t work as expected for array fields.
By default, array fields are compared by their reference, and overriding equals()
is highly appreciated to achieve the deep equality
check. The same strategy applies to hashcode()
and toString()
methods.
This rule reports an issue if a record class has an array field and is not overriding equals()
, hashcode()
or
toString()
methods.
record Person(String[] names, int age) {} // Noncompliant
record Person(String[] names, int age) { @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Arrays.equals(names, person.names); } @Override public int hashCode() { int result = Objects.hash(age); result = 31 * result + Arrays.hashCode(names); return result; } @Override public String toString() { return "Person{" + "names=" + Arrays.toString(names) + ", age=" + age + '}'; } }