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.


