3

我使用默认构造函数从子类设置recordId的值,并且最初没有使用lombok @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
    }
}
4

2 回答 2

4

Lombok@Builder根本不使用默认构造函数。它将其值传递给全参数构造函数,以便该构造函数可以用这些值填充新实例。@Builder不使用设置器或直接访问字段来执行此操作。因此,您的默认构造函数会被@Builder.

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

于 2018-11-26T07:53:18.263 回答
3

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

@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继承你可以使用这个技术

于 2018-11-26T11:03:45.587 回答