Какие есть способы поддерживать соответствие hashCode/equals с бизнес-определением класса?

Object javadocs и Джош Блох рассказывают нам многое о том, как должны быть реализованы hashCode/equals, а хорошие IDE будут правильно обрабатывать поля различных типов. Некоторое обсуждение всего этого можно найти здесь.

Этот вопрос касается следующего шага: как убедиться, что они остаются хорошими?

В частности, я чувствую, что для большинства классов, equals/hashCode должны быть реализованы так, как предлагает Bloch (и как реализуют Eclipse и другие IDE), и принимать во внимание все непроизводные, бизнес-логические поля этого класса. При добавлении новых полей в класс как часть постоянной работы, люди часто забывают добавить их в реализацию equals/hashCode. Это может привести к трудно обнаруживаемым ошибкам, когда два объекта кажутся одинаковыми, но на самом деле отличаются значением недавно введенного поля.

Как команда (даже одна!) может помочь убедиться, что equals/hashCode в классе продолжает учитывать все соответствующие поля по мере изменения полей-членов?

Я знаю, что Apache's EqualsBuilder и HashCodeBuilder могут использовать рефлексию, которая, очевидно, будет учитывать правильные поля, но я хочу избежать затрат на производительность при их использовании. Существуют ли другие подходы, чтобы отметить поля, которые не включены в equals/hashCode, а должны быть? Статический анализ кода, возможности IDE, методы модульного тестирования?

20
задан Community 23 May 2017 в 11:51
поделиться