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

3

我是从子类使用默认构造函数设置recordId值的,最初并没有使用lombok的@Builder。最终我决定在这里使用Builder,但问题是lombok Builder会在内部覆盖我的默认构造函数,因此值永远无法设置。

如何设置任何钩子以使lombok@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
    }
}

哈哈,是的,我已经点赞了你的回答 :) - Rahul Babu
2个回答

4
Lombok的@Builder不使用默认构造函数,而是将其值传递给一个全参构造函数,以便该构造函数可以用这些值填充新实例。@Builder不使用setter或直接访问字段来实现此目的。因此,@Builder会忽略您的默认构造函数。
您可以编写自己的全参构造函数。在其中,您可以设置recordId的值,并从参数中分配其余字段。

3
我认为你应该在基类中创建一个构造函数:
```html

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

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

顺便说一句,如果您想在IT技术中使用Lombok Builder和继承,可以使用这个技术


1
Lombok 1.18.2 添加了@SuperBuilder,在大多数继承情况下,它比您链接的解决方案更优越。 - Jan Rieke
@JanRieke没错,但是在IDEA中还不支持 - Cepr0
是的,这真是遗憾 :( - Jan Rieke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接