Главный исходный вопрос:
Желательно ли добавлять аннотацию @EqualsAndHashCode (callSuper = true) или @EqualsAndHashCode (callSuper = false)?
Принятый ответ в основном просто:
...это зависит от...
Чтобы расширить это, в документации по @EqualsAndHashCode есть некоторые четкие рекомендации по выбору. Особенно это, ИМХО:
Установив для callSuper значение true, вы можете включить методы equals и hashCode вашего суперкласса в сгенерированные методы. Для hashCode результат super.hashCode () включается в алгоритм хеширования, а для forequals сгенерированный метод вернет false, если супер реализация считает, что он не равен переданному объекту. Имейте в виду, что не все реализации equals справляются с этой ситуацией должным образом. Однако сгенерированные ломбоком реализации equals справляются с этой ситуацией должным образом, поэтому вы можете безопасно вызывать свой суперкласс equals, если он также имеет сгенерированный ломбоком метод equals.
Чтобы немного уменьшить это: выберите callSuper = true, если вы наследуете суперкласс, который либо не имеет информации о состоянии, либо сам использует аннотацию @Data, либо имеет реализации equals / hash, которые «обрабатывают ситуацию должным образом» - что я интерпретирую как возвращение правильного хеша значений состояния.