亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Lombok 自定義 SuperBuilder

Lombok 自定義 SuperBuilder

收到一只叮咚 2021-12-22 19:07:07
我有兩個這樣的課程:@Builderpublic class Parent {    final int a;    final int b;    public class static ParentBuilder {        public ParentBuilder setAllTo(final int value) {           return a(value).b(value);        }    }}public class Child extends Parent {   final in c;   @Builder(builderMethodName = "childBuilder")   public Child(final int a, final int b, final int c) {      super(a, b);      this.c = c;   }}我的班級正在成長,并且有越來越多的領域。這是使用@SuperBuilder. 但是如何添加自定義構建器方法?同樣的方式 dosent 工作。我試過這種方式:@SuperBuilderpublic abstract class Parent { //yes, I want a abstract parent    final int a;    final int b;    public class static ParentBuilder {        public ParentBuilder setAllTo(final int value) {           return a(value).b(value);        }    }}@SuperBuilderpublic class Child extends Parent {   final in c;}編輯它還不可能。當我嘗試以相同的方式執行此操作時,出現異常:@SuperBuilder does not support customized builders. Use @Builder instead.覆蓋是這樣的內部類:public abstract static class ParentBuilder<C extends ParentBuilder, B extends Parent.ParentBuilder<C, B>> {    // custom imlementations here}
查看完整描述

2 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

我最近嘗試@SuperBuilder使用 Lombok 1.18.8 和 IntelliJ 進行自定義,效果很好。我面臨的唯一問題是,我無法toBuilder在 SuperBuilder - 中使用標志@SuperBuilder(toBuilder=true)。


下面是覆蓋@SuperBuilder 方法的代碼。


public static abstract class ChildBuilder<C extends Child, B extends ChildBuilder<C, B>>

        extends ParentBuilder<C, B> {


    private LocalDate date;


    public B date(String dateStr) {

        this.date = LocalDate.parse(dateStr);

        return self();

    }

}


查看完整回答
反對 回復 2021-12-22
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

當@SuperBuilder在1.18.2介紹,自定義這是不可能的。如果您嘗試,Lombok 1.18.2 會為您提供錯誤消息SuperBuilder does not support customized builders.


但是,Lombok 1.18.4 添加了有限的@SuperBuilder. (這是有限的,因為你不能修改setter方法,但你可以添加自己的方法并修改build()和builder()。)


生成的@SuperBuilder代碼相當復雜,與@Builder. 為避免意外弄亂加載泛型的構建器代碼,您應該首先從 delombok 輸出中復制構建器類標頭。在您的情況下(添加新的 setter 方法),自定義抽象構建器類ParentBuilder(而不是ParentBuilderImpl)。查看 delomboked 代碼以了解應如何定義 setter,尤其是返回類型。


這是您示例的自定義構建器代碼:


public abstract static class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {

    public B setAllTo(final int value) {

       return a(value).b(value);

    }

}

使用 Lombok 1.18.4,它可以編譯并按預期工作。


查看完整回答
反對 回復 2021-12-22
  • 2 回答
  • 0 關注
  • 460 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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