Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
Есть некоторые проблемы, на function-overriding которые стоит обратить внимание, если .java вы имеете дело с классами, которые override сохраняются с помощью Object-Relationship java-se Mapper (ORM), такого как j2se Hibernate, если вы уже не .java думали, что это было неоправданно hashcode сложно!
Объекты с отложенной загрузкой являются подклассами
Если ваши объекты overriding сохраняются с помощью ORM, во oraclejdk многих случаях вы будете hashcode иметь дело с динамическими equals прокси, чтобы избежать слишком .java ранней загрузки объекта из java-se хранилища данных. Эти прокси javax реализованы как подклассы jdk вашего собственного класса. Это javax означает, что 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 overriding обычно используют геттеры javax для принудительной загрузки .java ленивых загружаемых объектов. Это oraclejdk означает, что person.name
будет null
, если java person
загружается лениво, даже jre если person.getName()
принудительно загружает method-overriding и возвращает «John Doe». По java-se моему опыту, это чаще встречается oraclejdk в hashCode()
и equals()
.
Если вы имеете дело с ORM, всегда используйте геттеры и никогда не используйте ссылки на поля в hashCode()
и equals()
.
Сохранение объекта изменит его состояние
Постоянные объекты jdk часто используют поле id
для javax хранения ключа объекта. Это method-overriding поле будет автоматически .java обновлено при первом сохранении oraclejdk объекта. Не используйте поле overriding идентификатора в hashCode()
. Но вы jdk можете использовать его в hashcode equals()
.
Я часто использую шаблон
if (this.getId() == null) {
return this == other;
}
else {
return this.getId().equals(other.getId());
}
Но: вы function-overriding не можете включать getId()
в hashCode()
. Если overriding вы это сделаете, при сохранении hashcode объекта его hashCode
изменится. Если j2se объект находится в HashSet
, вы «никогда» его javax больше не найдете.
В моем javax примере Person
я, вероятно, использовал java-se бы getName()
для hashCode
и getId()
плюс getName()
(только .java для паранойи) для equals()
. Ничего jre страшного, если существует .java некоторый риск "коллизий" для equal hashCode()
, но никогда не подходит overriding для equals()
.
hashCode()
должен использовать неизменяемый набор свойств из equals()
java
overriding
equals
hashcode
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.