-
Notifications
You must be signed in to change notification settings - Fork 3
How to work with equals
Aleksandr Kuchuk edited this page Jul 26, 2016
·
2 revisions
Метод equals()
содержится в Object, а значит есть у всех классов в Java.
Он является важнейшей частью работы с объектами.
Как выглядит по умолчанию:
public boolean equals(Object obj) {
return (this == obj);
}
Т.е по умолчанию он проверяет является ли объект obj тем же самым объектом, у которого вызвали equals.
Если сравнить два различных объекта с одними и теми же полями - получим false
.
Так как же правильно работать с 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.