Java: Automatic equals() и hashCode()

Реализация equals() и hashCode() для простых данных POJO загромождает мой код и поддерживается утомительно.

Какие библиотеки обрабатывают это автоматически?
Из-за соображений производительности я предпочитаю инструментарий байт-кода по методу AOP.

Обновление: Обсуждалась тема необходимости использования equals() и hashCode(), здесь моя точка:

Разве это не лучше, если это сделать правильно с минимальными усилиями, а не копать в коде, добавив hC/eq, когда дело доходит до него?

Ответ 1

Проект Lombok содержит аннотацию @EqualsAndHashCode, которая будет сгенерируйте equals() и hashCode() для ваших классов Java. Конечно, есть некоторые недостатки по сравнению с ручным применением этих методов, поэтому убедитесь, что вы прочитали "мелкий шрифт" на связанной странице.

Ответ 3

Вы можете использовать Google AutoValue, чтобы автоматически генерировать неизменяемые классы значений с equals и hashCode. Эти классы значений несколько похожи на классы классов Scala или те, которые генерируются Ломбоком.

Там также post о том, как использовать его в среде IDE.

Ответ 4

В библиотеке Apocal commons-lang есть HashCodeBuilder и EqualsBuilder, которые сделают для вас часть работы и сократят эти методы. Существуют даже версии отражения, которые сделают все это для вас на основе полей в POJO. Однако я бы не рекомендовал этого. Отражение может быть медленным (хотя и не так плохо, как многие думают), и вы должны реализовать их, чтобы убедиться, что для равенства рассматриваются только правильные поля.

Мой вопрос: вам действительно нужно это делать? Часто hashcode и equals на POJO нужно использовать только для использования с Картами или наборами. В случае с Картами обычно используется идентификатор для ключа, который не является самим Pojo. Итак,... вы делаете работу для себя?