EqualsBuilder и HashCodeBuilder Apache в Hibernate
Быстрый ответ
Рекомендуемый способ точной и надёжной реализации методов equals
и hashCode
– использование классов EqualsBuilder
и HashCodeBuilder
из библиотеки Apache Commons. Эти классы гарантируют точное сравнение объектов и равномерное распределение хеш-кодов.
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object that) {
if (this == that) return true;
if (that == null || getClass() != that.getClass()) return false;
Person person = (Person) that;
return new EqualsBuilder()
.append(name, person.name)
.append(age, person.age)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(name)
.append(age)
.toHashCode();
}
}
Этот код позволяет избежать сложностей, связанных с использованием рефлексии, что особенно актуально при работе с Hibernate.
Завершение
Преимущества Java 7+ и Guava
Создание эффективных методов equals
и hashCode
становится проще с использованием Java 7+
и библиотеки Guava
, которые позволяют обходиться без трудоёмкой рефлексии и вспомогательных объектов. Попробуйте методы Objects
из Java или com.google.common.base.Objects
из Guava
.
Проверки на одинаковость ссылок, null и классов
Формирование метода equals
следует начинать с быстрых проверок:
if (this == obj) return true;
if (!(obj instanceof MyBean)) return false;
Касательно обращения с подклассами:
if (obj == null || obj.getClass() != getClass()) return false;
Сопоставление суперкласса в equals
Проверьте равенство объектов на основе состояния суперкласса в методе equals
:
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) return false;
// Остальные проверки
}
Производительность hashCode
Обеспечьте эффективное хеширование примитивных полей, вычисляя хеш-код каждого поля индивидуально:
@Override
public int hashCode() {
int result = fieldName1.hashCode();
result = 31 * result + Integer.hashCode(fieldName2);
return result;
}
Особенности работы с Hibernate
При использовании Hibernate для equals
и hashCode
важно применять специфический подход, чтобы избежать проблем, связанных с ленивыми коллекциями и прокси.
Среды разработки
Среды разработки, такие как Eclipse, предлагают возможность генерации методов equals
и hashCode
. Однако, всегда стоит проверять и настраивать сгенерированный код.
Визуализация
Выбор в пользу EqualsBuilder
и HashCodeBuilder
из Apache Commons – это выбор надёжности и высокой производительности при создании архитектуры объектов с использованием Java.
Удовлетворение конкретных потребностей
Рефлексия или ручные проверки?
Старайтесь предпочитать ручные проверки вместо методов, основанных на рефлексии, так как это увеличивает производительность и предоставляет больший контроль.
Альтернативы Apache Commons
Если библиотека Apache Commons не подходит, обратите внимание на Guava или встроенные инструменты Java 7, такие как Objects.equals()
и Objects.hash()
.
Бдительность при работе с Hibernate
При создании моделей с помощью Hibernate крайне важно тщательно подходить к переопределению методов equals
и hashCode
.