mam klasę
@Value
@NonFinal
public class A {
int x;
int y;
}
Mam inną klasę B.
@Value
public class B extends A {
int z;
}
lombok generuje błąd, mówiąc, że nie można znaleźć konstruktora A (), jawnie nazwij to tym, co chcę, aby lombok zrobił, to przekazanie adnotacji do klasy b, tak aby generowała następujący kod:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
Czy mamy adnotację, aby to zrobić w Lombok?
inConstructor
metodę adnotacji konstruktorów, w której możemy określić, który konstruktorsuper
ma wstrzyknąć Lombok do wygenerowanego konstruktora?Wydanie Lombok # 78 odwołuje się do tej strony https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ z tym uroczym wyjaśnieniem:
Zauważyłem również, że działa to dobrze z Spring Data JPA.
źródło
Lombok nie obsługuje tego również wskazanego przez tworzenie
@Value
klas z adnotacjamifinal
(jak wiesz, używając@NonFinal
).Jedynym rozwiązaniem, które znalazłem, jest samodzielne zadeklarowanie wszystkich członków jako ostatecznych i użycie
@Data
zamiast tego adnotacji. Te podklasy muszą być opatrzone adnotacjami@EqualsAndHashCode
i wymagają jawnego konstruktora wszystkich argumentów, ponieważ Lombok nie wie, jak utworzyć klasę za pomocą wszystkich argumentów jednej z superklasy:Szczególnie konstruktorzy podklas sprawiają, że rozwiązanie jest trochę nieporządne dla nadklas z wieloma członkami, przepraszam.
źródło
@EqualsAndHashCode
”? Czy ta adnotacja nie jest uwzględniona przez@Data
? Dzięki :)@Data
również tworzy equals () i hashCode (), ale nie dba o żadne dziedziczenie. Aby upewnić się, że nadklasa jest równa () i hashCode () jest używana, potrzebujesz jawnej generacji z callSuperw przypadku superklas z wieloma członkami sugerowałbym użycie @Delegate
źródło
@Delegate
jest@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
powinno być w poluA
.Jeśli klasa dziecięca ma więcej członków niż rodzica, można to zrobić niezbyt czysto, ale krótko:
źródło
Wersja 1.18 Lombok wprowadziła adnotację @SuperBuilder. Możemy to wykorzystać, aby rozwiązać nasz problem w prostszy sposób.
Możesz zapoznać się z https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 .
więc w klasie dziecięcej będziesz potrzebować tych adnotacji:
w klasie rodzicielskiej:
źródło
Jako opcję możesz użyć
com.fasterxml.jackson.databind.ObjectMapper
do zainicjowania klasy potomnej od rodzicaW
lombok
razie potrzeby możesz nadal używać adnotacji w punktach A i B.źródło