繁体   English   中英

Lombok builder 覆盖默认构造函数

[英]Lombok builder override default constructor

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

我怎样才能放置任何钩子让@Builder使用我的默认构造函数?

父类:

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

儿童班:

@Getter
@Setter
@Builder
@ToString
@AllArgsConstructor
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
    }
}

Lombok 的@Builder根本不使用默认构造函数。 它将其值传递给全参数构造函数,以便该构造函数可以用这些值填充新实例。 @Builder不使用 setter 或直接访问字段来这样做。 所以你的默认构造函数被@Builder简单地忽略了。

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

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

@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;
    }
}

PS 如果您想使用带有继承的Lombok Builder,您可以使用此技术

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM