Common Builder-Basisinstanz für eine Klassenhierarchie mit LombokJava

Java-Forum
Guest
 Common Builder-Basisinstanz für eine Klassenhierarchie mit Lombok

Post by Guest »

Ich habe eine Klassenhierarchie mit einer einzelnen abstrakten Basisklasse und mehreren untergeordneten Klassen. Die Basisklasse verfügt über ca. 25 Felder und jedes untergeordnete Element verfügt über eine zusätzliche Anzahl von 0–8 Feldern.

Ich möchte das Builder-Muster verwenden, um jede untergeordnete Instanz zu erstellen, und ich Ich möchte so oft wie möglich Lombok verwenden, um den Code prägnant zu halten. Nach diesem Vorschlag habe ich den folgenden Code:

Code: Select all

@AllArgsConstructor
@Data
public abstract class Base {
private int b1, b2, ... , b25;
}

public class C1 extends Base {
private int c11, c12, ... , c16;

@Builder
private C1(int b1, int b2, ..., int b25, int c11, ... int c16) {
super(b1, b2, ...., b25);
this.c11 = c11;
...
this.c16 = c16;
}
}

public class C2 extends Base {

@Builder
private C2(int b1, int b2, ..., int b25) {
super(b1, b2, ...., b25);
}
}
Dies erleichtert den Aufbau der untergeordneten Klassen als

Code: Select all

C1 c1 = C1.builder().b1(1).b2(2)....b25(25).c11(101).c12(102).build();
C2 c2 = C2.builder().b1(1).b2(2)....b25(25).build();
Das Problem besteht darin, dass die verketteten Aufrufe .b1().b2()... jedes Mal wiederholt werden, wenn eine untergeordnete Klasse erstellt wird.

Idealerweise möchte ich eine gemeinsame Methode zum Festlegen der B-Werte, unabhängig davon, welche untergeordnete Klasse erstellt wird. (Nehmen wir an, es gibt eine andere Klasse namens BValuesProvider, die diese Werte bereitstellen kann)

Code: Select all

public void setBValues(BValuesProvider bv, // what else goes here??? //) {
// something.b1(bv.b1()).b2(bv.b2()) ...
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
C1.Builder c1b = C1.builder().c11(c11).c12(c12)....c16(c16);
// Call setBValues somehow
return c1b.build();
}

public createC2(BValuesProvider bv) {
// Call setBValues somehow
return c2b.build();
}
Meine aktuelle Lösung bestand darin, die @Data-Annotation an die Basisklasse anzuhängen, um Setter/Getter verfügbar zu machen, sodass mein Code so aussieht:

Code: Select all

public void setBValues(BValuesProvider bv, Base cx) {
cx.setB1(bv.b1());
cx.setB2(bv.b2());
...
cx.setB25(bv.b25());
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
C1 c1 = C1.builder().c11(c11).c12(c12)....c16(c16).build();
setBValues(bv, c1);
return c1;
}

public createC2(BValuesProvider bv) {
C2 c2 = C2.builder().build();
setBValues(bv, c2);
return c2;
}
Fragen:
  • Gibt es einen besseren Weg, dies zu tun? ? Insbesondere denke ich, dass es ein schlechtes Muster zu sein scheint, zuerst eine untergeordnete Klasse (vollständig) zu erstellen und dann setBxx()-Funktionen darauf aufzurufen. Das Offenlegen der Setter selbst macht die Klasse ziemlich veränderbar.
  • Auf SO gab es weitere Fragen zu Buildern/Vererbung


    Builder-Muster und Vererbung
  • Unterklassen einer Java Builder-Klasse
  • wie man den Superkonstruktor in Lombok aufruft< /li>
Allerdings spricht keiner von ihnen davon, einen „Basis-Builder“ zu haben, von dem jeder untergeordnete
Builder eine Unterklasse ist. Daher kann ich mithilfe von Generika nicht herausfinden,
wie das zweite Argument für die Funktion setBValues lauten sollte.
[*]Ich habe auch Lomboks @ ausprobiert. Superbuilder-Anmerkung, aber auch hier vereinfacht es den Code erheblich, ich weiß jedoch immer noch nicht, wie ich einen Basis-Builder erhalten kann.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post