Где в Java описан контракт метода equals(), включая правило рефлексивности?

«Где в Java описан контракт метода equals(), включая правило рефлексивности?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полный контракт метода equals() определен в документации (JavaDoc) класса java.lang.Object. Правило рефлексивности является его первой и обязательной частью.

Контракт из JavaDoc Object.equals(Object obj):

  1. Рефлексивность (Reflexive): Для любого ненулевого объекта x, x.equals(x) должно возвращать true.
  2. Симметричность (Symmetric).
  3. Транзитивность (Transitive).
  4. Согласованность (Consistent).
  5. Сравнение с null: Для любого ненулевого объекта x, x.equals(null) должно возвращать false.

Практическая реализация рефлексивности: Чаще всего она обеспечивается неявно, но для оптимизации в начале метода equals добавляют проверку на равенство ссылок (==).

@Override
public boolean equals(Object o) {
    // Рефлексивность: объект равен самому себе
    if (this == o) {
        return true;
    }
    // Проверка типа и приведение
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    MyClass myClass = (MyClass) o;
    // Сравнение значимых полей
    return Objects.equals(field1, myClass.field1) &&
           Objects.equals(field2, myClass.field2);
}

Ссылка на источник: Oracle Java SE 8 Documentation - Object.equals()