Наследование Ломбок с @EqualsAndHashCode

1

У меня есть класс, который расширяет родительский класс, используя @EqualsAndHashCode. Я получаю ошибку компиляции с Lombok 1.16.0 и Java 8

@EqualsAndHashCode(doNotUseGetters = true, of = { "propertyA", "propertyB" }) public class Parent {...}

@EqualsAndHashCode(callSuper = true, doNotUseGetters = true, of = { "propertyC", "propertyD" }) public class Child extends Parent {...}

Ошибка...

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project granger: Compilation failure [ERROR]/Users/sarah/src/main/java/com/xxx/Child.java:[26,1] canEqual(java.lang.Object) in com.xxx.Child cannot override canEqual(java.lang.Object) in com.yyy.Parent [ERROR] attempting to assign weaker access privileges; was public [ERROR] attempting to assign weaker access privileges; was public

Есть ли какая-либо передовая практика по наследованию и @EqualsAndHashCode и Lombok, что я злоупотребляю? Или любой путь вокруг этого?

Теги:
java-8
lombok

2 ответа

1
Лучший ответ

Кажется, что классы находятся в разных артефактах или вы делали инкрементную сборку.

До 1.14 canEqual был public, с тех пор он protected.

Если вы делаете clean и/или компилируемый Parent используя Lombok 1.16, он должен работать.

2

Даже если вы создали эту сборку, у вас получится сломанный метод equals, потому что он не будет симметричным (parent.equals(child) если они имеют одинаковые значения в родительских полях, но не child.equals(parent)), Прошло некоторое время с тех пор, как я использовал Lombok, но классы классов scala (которые в этом отношении более или менее эквивалентны) не могут распространять другие классы case по этой причине.

Подумайте очень внимательно о том, что представляют Parent и Child. Действительно ли Child Лисков-заменяемый для Parent? Если это так, было бы лучше наследовать определение equals и hashCode от Parent, а не пытаться переопределить их в Child вообще; если нет, может быть лучше извлечь общую функциональность в общий суперкласс, который распространяется как для Parent и для Child, а не для того, чтобы иметь их как родительский и дочерний.

  • 0
    Спасибо за вдумчивый ответ. Я думаю, что это объясняет лучший ход действий, но ответ Zeroflag объясняет, почему это происходило технически.
  • 0
    На самом деле, Ломбок делает это правильно, смотрите этот комментарий . Он поддерживает оба случая, но вам может потребоваться переопределить canEqual чтобы сделать это правильно. Существуют случаи, когда важно обеспечить равные экземпляры подклассов, например прокси Hibernate.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню