天天看点

解决Lombok父类与子类Builder不兼容父类与子类 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不兼容
           
解决Lombok父类与子类Builder不兼容父类与子类 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父类与子类Builder不兼容父类与子类 Builder不兼容场景解决方案推荐文档

推荐文档

lombok 常用注解