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

新手上路,请多包涵

我有这个简单的代码:

 @Data
@Builder
public class RegistrationInfo {

    private String mail;
    private String password;

    public RegistrationInfo(RegistrationInfo registrationInfo) {
        this.mail = registrationInfo.mail;
        this.password = registrationInfo.password;
    }
}

首先,我只使用了 @Builder 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

所以我有两个问题:

  1. 为什么 Lombok @Builder 与这个构造函数不兼容?
  2. 考虑到我同时需要构建器和构造函数,我该如何编译代码?

原文由 IKo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 954
2 个回答

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

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

(引用@Andrew Tobilko)

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

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

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

原文由 wdc 发布,翻译遵循 CC BY-SA 4.0 许可协议

当您提供自己的构造函数时,Lombok 不会创建一个包含 @Builder 正在使用的所有参数的构造函数。所以你应该只添加注释 @AllArgsConstructor 到你的班级:

 @Data //try to avoid as it's an anti-pattern
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RegistrationInfo {
    //...
}

原文由 Cepr0 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题