Ответ
Каноническая реализация equals() в Java:
@Override
public boolean equals(Object obj) {
// 1. Проверка ссылочного равенства
if (this == obj) return true;
// 2. Проверка на null и совпадение класса
if (obj == null || getClass() != obj.getClass()) return false;
// 3. Приведение типа и сравнение полей
MyClass other = (MyClass) obj;
return Objects.equals(this.name, other.name)
&& this.age == other.age
&& Objects.equals(this.email, other.email);
}
Ключевые шаги и best practices:
- Ссылочное равенство: Быстрая проверка
if (this == obj). - Проверка типа: Убедиться, что
objнеnullи имеет тот же класс (getClass()). Использованиеinstanceofдопустимо для нефинальных классов, если соблюдается симметричность. - Безопасное сравнение полей: Использовать
Objects.equals()для ссылочных типов (обрабатываетnull) и==для примитивов. - Согласованность с hashCode(): Всегда переопределяйте
hashCode(), если переопределяетеequals(), чтобы объекты, признанные равными, имели одинаковый хэш-код.
Современная альтернатива (Java 14+): Используйте record, который автоматически генерирует equals(), hashCode() и toString() на основе компонентов.
public record MyClass(String name, int age, String email) {}