Выбор ответа Senior ООП и класс Object обновлено

equals и наследник с новым полем

Вопрос

Point(x, y) реализует equals через instanceof Point. Наследник ColorPoint добавил поле color и тоже сравнивает через instanceof ColorPoint плюс цвет. Что нарушено?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Симметричность: point.equals(cp) true, а cp.equals(point) false. Point.equals считает ColorPoint подходящим (он instanceof Point) и сравнивает только x и y: true.

Варианты ответа

  1. Рефлексивность: объект colorPoint перестаёт быть равен самому себе
  2. Симметричность: point.equals(cp) true, а cp.equals(point) falseправильный ответ
  3. Ничего: каждый класс сравнивает свои поля, и это корректно
  4. Только hashCode: он теперь не учитывает цвет, а equals корректен

Разбор

Point.equals считает ColorPoint подходящим (он instanceof Point) и сравнивает только x и y: true. ColorPoint.equals требует ColorPoint и получает false на обычном Point. Симметричность нарушена, коллекции начнут вести себя непредсказуемо. Решения: сравнивать через getClass() == o.getClass(), сделать классы final, или заменить наследование композицией. Рефлексивность при этом не страдает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.