ich habe ein klasse
@Value
@NonFinal
public class A {
int x;
int y;
}
Ich habe eine andere Klasse B.
@Value
public class B extends A {
int z;
}
lombok gibt einen Fehler aus, der besagt, dass es keinen A () -Konstruktor finden kann. Nenne es explizit. Ich möchte, dass lombok der Klasse b eine Anmerkung gibt, so dass der folgende Code generiert wird:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
Haben wir eine Anmerkung dazu in Lombok?
inConstructor
Methode für Konstruktoranmerkungen bereitstellen, bei der wir angeben können, welcher Konstruktor vonsuper
Lombok in den generierten Konstruktor injiziert werden soll?Die Lombok-Ausgabe Nr. 78 verweist auf diese Seite https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ mit dieser schönen Erklärung:
Ich fand auch, dass dies gut mit Spring Data JPA funktioniert.
quelle
Lombok unterstützt dies nicht, indem Sie eine
@Value
kommentierte Klasse erstellenfinal
(wie Sie wissen, indem Sie verwenden@NonFinal
).Die einzige Problemumgehung, die ich gefunden habe, besteht darin, alle Mitglieder für endgültig zu erklären und
@Data
stattdessen die Anmerkung zu verwenden. Diese Unterklassen müssen mit@EqualsAndHashCode
einem expliziten Konstruktor für alle Argumente kommentiert werden und benötigen einen expliziten Konstruktor für alle Argumente, da Lombok nicht weiß, wie man eine mit allen Argumenten der Superklasse erstellt:Besonders die Konstruktoren der Unterklassen machen die Lösung für Superklassen mit vielen Mitgliedern etwas unordentlich, sorry.
quelle
@EqualsAndHashCode
"? Ist diese Anmerkung nicht enthalten von@Data
? Thx :)@Data
erstellt auch equals () und hashCode (), kümmert sich jedoch nicht um Vererbung. Um sicherzustellen, dass die Superklasse gleich () und hashCode () verwendet wird, benötigen Sie die explizite Generierung mit callSuperFür Superklassen mit vielen Mitgliedern würde ich empfehlen, @Delegate zu verwenden
quelle
@Delegate
ist@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
sollte Feld in seinA
.Wenn die Kinderklasse mehr Mitglieder als die Eltern hat, kann dies nicht sehr sauber, sondern auf kurze Weise durchgeführt werden:
quelle
In Version 1.18 von Lombok wurde die Annotation @SuperBuilder eingeführt. Wir können dies nutzen, um unser Problem auf einfachere Weise zu lösen.
Sie können auf https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 verweisen .
In Ihrer Kinderklasse benötigen Sie folgende Anmerkungen:
in deiner Elternklasse:
quelle