Как можно поддерживать hashCode / equals в соответствии с бизнес-определением класса?
Object Javadocs и Josh Bloch рассказывают нам о том, как должен быть реализован hashCode / equals, и хорошие IDE будут правильно обрабатывать поля различных типов. Некоторое обсуждение всего, что естьВот.
Этот вопрос о следующем шаге: как вы убедитесь, что ониоставаться хороший?
В частности, я считаю, что для большинства классов equals / hashCode должен быть реализован так, как предлагает Блох (и Eclipse и другие реализации IDE), и учитывать все непроизводные бизнес-логические поля в этом классе. Добавляя новые поля в класс как часть продолжающейся работы, люди часто забывают добавить их в реализацию equals / hashCode. Это может привести к трудно обнаруживаемым ошибкам, когда два объекта кажутся одинаковыми, но на самом деле отличаются значением недавно введенного поля.
Как команда (даже одна!) Может помочь обеспечить, чтобы equals / hashCode в классе продолжал принимать во внимание все соответствующие поля при изменении полей участника?
Я знаю, что Apache EqualsBuilder и HashCodeBuilder могут использовать рефлексию, которая, очевидно, будет учитывать правильные поля, но я хочу избежать затрат производительности при их использовании. Существуют ли другие подходы для пометки полей, которые не включены в equals / hashCode и должны быть? Статический анализ кода, возможности IDE, методы модульного тестирования?