第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Lombok 的類層次結構的 Common Builder 基實例

使用 Lombok 的類層次結構的 Common Builder 基實例

繁星coding 2023-06-04 11:20:06
我有一個類層次結構,其中包含一個抽象基類和幾個子類?;愑?~25 個字段,每個子類都有額外的 0-8 個字段。我想使用 Builder 模式來構造每個子實例,并且我想盡可能使用 Lombok 以保持代碼簡潔。按照這個建議,?我有如下代碼:@AllArgsConstructor@Datapublic 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);? ?}}這使得構建子類變得容易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();問題是.b1().b2()...每次創(chuàng)建任何子類時都會重復鏈接調用。理想情況下,我想要一種通用的方法來設置 B 值,而不管正在構建哪個子類。(假設還有另一個類BValuesProvider可以提供這些值)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();}我當前的解決方案是將注釋附加@Data到基類以公開 setter/getter,因此我的代碼如下所示: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;}問題:有一個更好的方法嗎?具體來說,我覺得首先(完全)構建一個子類,然后setBxx()在其上調用函數似乎是一種糟糕的模式。暴露 setter 本身使類非??勺?。SO 上還有其他關于構建器/繼承的問題但是,他們都沒有談論擁有每個子構建器都是其子類的“基礎構建器”。所以,我不知道使用泛型,函數的第二個參數setBValues應該是什么。建造者模式與繼承繼承 Java Builder 類如何在 Lombok 中調用超級構造函數我也嘗試了 Lombok 的@Superbuilder注解,但同樣,雖然它大大簡化了代碼,但我仍然不知道如何獲得基礎構建器。
查看完整描述

2 回答

?
ITMISS

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


查看完整回答
反對 回復 2023-06-04
?
喵喵時光機

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í)行操作。


查看完整回答
反對 回復 2023-06-04
  • 2 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號