为什么Lombok @Builder与该构造函数不兼容?

时间:2018-07-01 10:18:32

标签: java lombok

我有这个简单的代码:

bin/logstash-plugin install logstash-filter-prune

首先,我只使用了@Data @Builder public class RegistrationInfo { private String mail; private String password; public RegistrationInfo(RegistrationInfo registrationInfo) { this.mail = registrationInfo.mail; this.password = registrationInfo.password; } } Lombok批注,一切都很好。但是我添加了构造函数,并且代码不再编译。错误是:

@Builder

所以我有两个问题:

  1. 为什么Lombok Error:(2, 1) java: constructor RegistrationInfo in class com.user.RegistrationInfo cannot be applied to given types; required: com.user.RegistrationInfo found: java.lang.String,java.lang.String reason: actual and formal argument lists differ in length 与该构造函数不兼容?
  2. 考虑到我既需要构建器又需要构造器,如何使代码编译?

3 个答案:

答案 0 :(得分:4)

您可以添加@AllArgsConstructor注释,因为

  

@Builder如果没有其他参数,则会生成一个全参数的构造函数   构造函数已定义。

(引用@Andrew Tobilko)

或将属性设置为@Builder@Builder(toBuilder = true)这为您提供了复制构造函数的功能。

@Builder(toBuilder = true)
class Foo {
    // fields, etc
}

Foo foo = getReferenceToFooInstance();
Foo copy = foo.toBuilder().build();

答案 1 :(得分:2)

当您提供自己的构造函数时,Lombok不会使用@Builder使用的所有args创建c-tor。因此,您只需在课程中添加注释@AllArgsConstructor

@Data
@Builder
@AllArgsConstructor
public class RegistrationInfo {
    //...
}

答案 2 :(得分:2)

大概是@Builder,如果没有定义其他构造函数,则会生成一个全参数的构造函数。

@Data
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
class RegistrationInfo {

    private String mail;
    private String password;

    private RegistrationInfo(RegistrationInfo registrationInfo) {
        this(registrationInfo.mail, registrationInfo.password);
    }
}