解決Lombok父類與子類Builder不兼容

Lombok 是我們經常使用的插件,@Builder也是我們經常使用的註解,那你有沒有遇見過如下錯誤呢?

父類與子類 Builder不兼容場景

 Error:(16, 1) java: com.jdcloud.jdsf.demo.consumer.domain.ChildModel 中的 builder() 無法隱藏 com.jdcloud.jdsf.demo.consumer.domain.ParentModel 中的 builder()
  返回類型com.jdcloud.jdsf.demo.consumer.domain.ChildModel.ChildModelBuilder與com.jdcloud.jdsf.demo.consumer.domain.ParentModel.ParentModelBuilder不兼容

父類與子類 Builder不兼容場景

解決方案

不要將子類的@builder 加載類上,單獨寫一個需要builder 的構造函數,加載構造函數上,並對子類builder 進行單獨命名,同時使用時,也需要使用子類指定的builder。 請見如下代碼:

父類使用buidler

package com.jdcloud.jdsf.demo.consumer.domain;

import lombok.*;

/**
 * 測試 Lombok, 父類
 * @author [email protected]
 * @date 2020/5/24
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ParentModel {

    private String parentProp1;

}

子類使用builder

注意 單獨命名 childBuilder, 使用的時候,也是用 chilerBuilder 進行構建

package com.jdcloud.jdsf.demo.consumer.domain;

import lombok.*;

/**
 * Lombok 子類
 * @author [email protected]
 * @date 2020/5/24
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)// toString時,將也打印父類的屬性,默認時false 的
public class ChildModel extends ParentModel {

    private String childProp1;

    @Builder(builderMethodName = "chilerBuilder")
    public ChildModel(String parentProp1, String childProp1) {
        super(parentProp1);
        this.childProp1 = childProp1;
    }
}




例子

package com.jdcloud.jdsf.demo.consumer.domain;

import lombok.extern.slf4j.Slf4j;

/**
 * lombok demo
 * @author [email protected]
 * @date 2020/5/24
 */
@Slf4j
public class TestLombokServiceImpl {

    public static void main(String[] args) {

        ChildModel model = ChildModel.chilerBuilder().childProp1("child").parentProp1("parent").build();
        log.info("{}",model);
    }
}

運行結果

推薦文檔

lombok 常用註解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章