## Why is this an issue?

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.

### Noncompliant code example

    record Person(String[] names, int age) {} // Noncompliant

### Compliant solution

    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 +
                    '}';
        }
    }

## Resources

- Records specification