Comments 9
Метод equals() должен сравнивать полное состояние объектов (значения из полей)
Довольно-таки спорное утверждение. А если у объекта имеется коллекция других объектов, в свою очередь тоже содержащая коллекцию объектов? Я бы сказал, что сравнивать следует минимальное количество полей, необходимое для однозначной идентификации объекта.
Самой простой аналогией является запись в таблице БД: необязательно сравнивать все поля записи, т.к. достаточно сравнить значения первичных ключей.
Также неплохо было бы упомянуть, что хорошей практикой является использование в equals() и hashCode() immutable-полей.
Спасибо за дополнение. Действительно, эта тема в статье раскрыта недостаточно.
У объекта можно выделить два типа полей: относящиеся к идентичности объекта и относящиеся к его состоянию.
Идентичность — то, что уникально идентифицирует объект и не меняется в процессе его жизни (например, ID в базе, дата рождения и тд).
Состояние — то, что может изменяться (например, возраст человека, цвет машины и тд).
В equals должны принимать участие только поля, относящиеся к идентичности объекта, но не к состоянию. Иначе, например, при изменении возраста у человека — это уже будет несколько разных объектов.
Для хранимых сущностей (которые entity, но не value object), как правило, в equals участвует только id.
Например, AbstractPersistable из spring-data-jpa:
return null == this.getId() ? false : this.getId().equals(that.getId());
Хотя для hibernate есть немного мудренее рекомендации (раз, два) — использовать бизнес (натуральные) ключи.
И еще несколько ссылок про JPA, hashCode() и equals(): раз, два, три, четыре
Понимаю, что это перевод и в оригинале написана чепуха
This is a native method, which means it will be executed in another language like C, and will return some code regarding the object's memory address.
которую вы и перевели, но по-умолчанию hotspot (как и многие другие) таки возвращают просто псевдослучайное число — можно было бы и указать в пометках переводчика.
Замечал часто в переопределении hashCode в коде используется магическое число «31», с чем это связано?
Java Challengers #4: Сравнение объектов с equals() и hashCode()