Pull to refresh

Comments 9

В половине мест hashcode. А Java case sensitive язык, между прочим…
Большое спасибо! Вот это фейл. Поправил. PS В оригинале везде hashcode(), а я как-то не обратил внимания.
У вас пост на хабре не компилируется… да, я такого тоже не видел :)
Метод 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», с чем это связано?

Sign up to leave a comment.