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);
}
}
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();
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();
}
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;
}
- 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>
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.