-
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.