2 回答

TA貢獻1871條經驗 獲得超8個贊
@SuperBuilder這可以使用(實驗性的)注釋和 lombok >= 1.18.4來實現(xiàn)。您可以通過添加一個接受 a作為參數并設置所有值的方法來自定義@SuperBuilderof :BaseBValuesProvider
@SuperBuilder
public abstract class Base {
public static abstract class BaseBuilder<C extends Base, B extends BaseBuilder<C, B>> {
public B fillFromProvider(BValuesProvider bv) {
b1(bv.b1());
b2(bv.b2());
...
return self();
}
}
...
}
然后你可以像這樣使用它(實例bv在哪里BValuesProvider):
C1 c1 = C1.builder().fillFromProvider(bv).c11(11).build();

TA貢獻1846條經驗 獲得超7個贊
OP在這里。雖然這不是我提出的確切問題的答案,但我想分享一個仍然使用 Lombok 但不使用 @Builder 的替代方案。
@Getter
public abstract class Base<T extends Base> {
private int b1, b2, ... , b25;
private T cast() { return (T) this; }
public T setB1(final int b1) { this.b1 = b1; return cast(); }
public T setB2(final int b2) { this.b2 = b2; return cast(); }
...
}
@Getter @Setter @Accessors(chain = true)
public class C1 extends Base<C1> {
private int c11, c12, ... , c16;
public static C1 init() { return new C1(); }
private C1() {}
}
@Getter @Setter @Accessors(chain = true)
public class C2 extends Base<C2> {
public static C2 init() { return new C2(); }
private C2() {}
}
我剛剛泛化了基類并在子類上使用了鏈式訪問器。然后調用者將被修改為:
public void setBValues(BValuesProvider bv, Base cx) {
cx.setB1(bv.b1())
.setB2(bv.b2())
...
.setB25(bv.b25());
}
public createC1(BValuesProvider bv, c11, c12, ..., c16) {
C1 c1 = C1.init().setC11(c11)....setC16(c16);
setBValues(bv, c1);
return c1;
}
public createC2(BValuesProvider bv) {
C2 c2 = C2.init();
setBValues(bv, c2);
return c2;
}
優(yōu)點:
我的代碼不需要知道
BValuesProvider
以這種鏈式方式設置公共基本參數對我來說似乎更自然
缺點:
基類有點冗長,但總的來說,它還不錯,因為我們避免了每個子類中的大構造函數。
它不是真正的 Builder 模式,因為我們正在創(chuàng)建對象并在其上執(zhí)行一系列 set() 與在
.builder().x(x).y(y).build()
其上執(zhí)行操作。
添加回答
舉報