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 wangyushuai2@jd.com
* @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 wangyushuai2@jd.com
* @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 wangyushuai2@jd.com
* @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);
}
}