Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
Есть некоторые проблемы, на javax которые стоит обратить внимание, если equal вы имеете дело с классами, которые override сохраняются с помощью Object-Relationship equal Mapper (ORM), такого как hashcode Hibernate, если вы уже не function-overriding думали, что это было неоправданно equal сложно!
Объекты с отложенной загрузкой являются подклассами
Если ваши объекты function-overriding сохраняются с помощью ORM, во j2se многих случаях вы будете equal иметь дело с динамическими java прокси, чтобы избежать слишком function-overriding ранней загрузки объекта из java хранилища данных. Эти прокси .java реализованы как подклассы function-overriding вашего собственного класса. Это overriding означает, что this.getClass() == o.getClass()
вернет false
. Например:
Person saved = new Person("John Doe");
Long key = dao.save(saved);
dao.flush();
Person retrieved = dao.retrieve(key);
saved.getClass().equals(retrieved.getClass()); // Will return false if Person is loaded lazy
Если вы имеете дело с ORM, использование o instanceof Person
- единственное, что будет вести себя правильно.
Ленивые загружаемые объекты имеют пустые поля
ORM override обычно используют геттеры .java для принудительной загрузки core-java ленивых загружаемых объектов. Это jre означает, что person.name
будет null
, если override person
загружается лениво, даже .java если person.getName()
принудительно загружает equals и возвращает «John Doe». По equal моему опыту, это чаще встречается java в hashCode()
и equals()
.
Если вы имеете дело с ORM, всегда используйте геттеры и никогда не используйте ссылки на поля в hashCode()
и equals()
.
Сохранение объекта изменит его состояние
Постоянные объекты overrides часто используют поле id
для overriding хранения ключа объекта. Это java поле будет автоматически override обновлено при первом сохранении java объекта. Не используйте поле javax идентификатора в hashCode()
. Но вы .java можете использовать его в function-overriding equals()
.
Я часто использую шаблон
if (this.getId() == null) {
return this == other;
}
else {
return this.getId().equals(other.getId());
}
Но: вы core-java не можете включать getId()
в hashCode()
. Если .java вы это сделаете, при сохранении equal объекта его hashCode
изменится. Если java объект находится в HashSet
, вы «никогда» его jdk больше не найдете.
В моем jre примере Person
я, вероятно, использовал overriding бы getName()
для hashCode
и getId()
плюс getName()
(только equal для паранойи) для equals()
. Ничего openjdk страшного, если существует jdk некоторый риск "коллизий" для jdk hashCode()
, но никогда не подходит method-overriding для equals()
.
hashCode()
должен использовать неизменяемый набор свойств из equals()
java
overriding
equals
hashcode
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.