Lombok构建器覆盖默认构造函数

时间:2018-11-26 06:14:34

标签: java lombok intellij-lombok-plugin

我有以下情况

父类:

     @Getter
     @Setter
     public abstract class Record {
        private String recordId;
    }

儿童班:

@Getter
@Setter
@ToString
@AllArgsConstructor
@Builder
public  class SRecord extends Record {
    private static final String RECORD_ID = "REC001";
    private String street;
    private String city;

    public SRecord(){
        setRecordId(RECORD_ID); //value of recordId being set
    }
}

我正在使用默认构造函数从子类中设置recordId的值,而最初并未使用lombok Builder。最终,我决定在这里使用Builder,但是现在的问题是lombok Builder在内部覆盖了我的默认构造函数,因此从未设置该值。

任何建议我也可以放置任何钩子使lombok Builder使用我的默认构造函数吗?

2 个答案:

答案 0 :(得分:2)

Lombok的@Builder根本不使用默认构造函数。它将其值传递给all-args构造函数,以便该构造函数可以使用这些值填充新实例。 @Builder不使用setter或直接访问字段。因此,@Builder会忽略您的默认构造函数。

您可以做的是编写自己的all-args构造函数。在其中,您为recordId设置了值,并从参数中分配了其余字段。

答案 1 :(得分:2)

我认为您应该在基类中创建一个构造函数:

@Getter
@Setter
public abstract class Record {

    private String recordId;

    public Record(String recordId) {
        this.recordId = recordId;
    }
}

然后在继承的类的构造函数中使用它:

@Getter
@Setter   
@Builder
public class SRecord extends Record {

    private static final String RECORD_ID = "REC001";

    private String street;
    private String city;  

    public SRecord(String street, String city) {
        super(RECORD_ID); 
        this.street = street;
        this.city = city;
    }
}

P.S。如果要通过继承力使用Lombok Builder,则可以使用此technique