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