我有以下情况
父类:
@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使用我的默认构造函数吗?
答案 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。