Java. Класс Object и его методы. Часть 3 — equals

В предыдущем посте мы обсуждали метод hashCode, который используется в методе equals. Как видим в базовой реализации в нем простое сравнивание через оператор == который сравнивает hashCode 2 объектов. Именно поэтому без переопределения метода equals толку от него не особо много.

Итак, метод equals должен обладать 4 свойствами

  • Симметричность: Для двух ссылок, a и b, a.equals(b) тогда и только тогда, когда b.equals(a)
  • Рефлексивность: Для всех ненулевых ссылок, a.equals(a)
  • Транзитивность: Если a.equals(b) и b.equals(c), то тогда a.equals(c)
  • Совместимость с hashCode(): Два тождественно равных объекта должны иметь одно и то же значение hashCode()

Для удовлетворения этих свойств сама среда разработки предлагает шаблон, в котором соблюдаются эти 4 правила. Посмотрим на примере ранее созданного класса CustomObject с 3 полями.

Итак, видим простые проверки, сначала проверяем по методу родительского класса, далее если объект хранит null или классы не совпадают, то возвращаем false. После этих простых проверок идут проверки по каждому полю и если любое из них не совпадает по значению, то возвращает false.

Именно потому, что метод может принимать null, мы можем с легкостью сравнивать объект c null. Но не наоборот!

Мало кто знает, но есть еще класс Objects, в котором  есть метод deepEquals, который принимает на вход 2 объектa и исходя из типа (если сам объект является массивом примитивов) вызывает нужный метод для сравнивания в другом классе (Arrays). Вот все методы класса Objects. Он является утилитным классом, который вызывает методы класса Object с некими добавочными проверками.

Но! Если вы будете сравнивать 2 объекта, которые могут хранить null, то deepEquals выдаст вам true. Так что имейте ввиду.

Но это уже решается с помощью метода requireNonNull, в котором бросается эксепшн если аргумент является null.

Запись опубликована в рубрике Программирование Java. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *