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。 請見如下代碼:
父類使用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);
}
}