代码之家  ›  专栏  ›  技术社区  ›  IKo

为什么lombok@builder与此构造函数不兼容?

  •  5
  • IKo  · 技术社区  · 6 年前

    我有一个简单的代码:

    @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. 为什么是龙目 @建设者 与此构造函数不兼容?
    2. 如何在编译代码时考虑到构建器和构造函数的需要?
    3 回复  |  直到 6 年前
        1
  •  10
  •   Gavrilo Adamovic    6 年前

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

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

    (引用安德鲁·托比尔科)

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

    @Builder(toBuilder = true)
    class Foo {
        // fields, etc
    }
    
    Foo foo = getReferenceToFooInstance();
    Foo copy = foo.toBuilder().build();
    
        2
  •  5
  •   Cepr0    6 年前

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

    @Data
    @Builder
    @AllArgsConstructor
    public class RegistrationInfo {
        //...
    }
    
        3
  •  2
  •   Andrew    6 年前

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

    @Data
    @Builder
    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    class RegistrationInfo {
    
        private String mail;
        private String password;
    
        private RegistrationInfo(RegistrationInfo registrationInfo) {
            this(registrationInfo.mail, registrationInfo.password);
        }
    }