Skip to content

How to work with equals

Aleksandr Kuchuk edited this page Jul 26, 2016 · 2 revisions

Equals

Метод equals() содержится в Object, а значит есть у всех классов в Java. Он является важнейшей частью работы с объектами.

Как выглядит по умолчанию:

    public boolean equals(Object obj) {
        return (this == obj);
    }

Т.е по умолчанию он проверяет является ли объект obj тем же самым объектом, у которого вызвали equals. Если сравнить два различных объекта с одними и теми же полями - получим false.

Так как же правильно работать с equals?

Переопределяем equals

Основные правила:

  • Проверяем на то, что obj является или нет ссылкой на указанный объект. Если да - то true, если нет - false.
  • Проверяем на то, что объект имеет верный тип с помощью instanceof. Если нет - false.
  • После этого приводим obj к правильному типу для дальнейшего сравнения.
  • Проверяем необходимые поля объектов на равенство, если все равно - то true. Иначе -false.

Советы:

  • Для простых полей, кроме double и float используем обычное сравнение ==, для float и double используем Float.compare и Double.compare соответственно. Так как существуют всякие Float.NaN и т.д.
  • Для полей со ссылкой на объекты вызываем equals рекурсивно.
  • Если поле у объекта МОЖЕТ принимать значение null, то используем: java(field == null ? o.field == null : field.equals(o.field))
  • Не забываем также, что очередность сравнения влияет на производительность, поэтому сначала сравниваем поля, которые чаще других могут быть различны.

После этого проверим метод на транзитивность, симметричность и противоречивость, написав тесты. Обязательно переопределяйте hashCode.

НЕ пишите что-то типа:

public boolean equals( MyClass obj){}

Этот метод не переопределяет equals у Object.

Example

Clone this wiki locally