web-dev-qa-db-fra.com

Pourquoi Lombok @Builder n'est-il pas compatible avec ce constructeur?

J'ai ce code simple:

@Data
@Builder
public class RegistrationInfo {

    private String mail;
    private String password;

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

J'utilisais d'abord le @Builder Annotation Lombok et tout allait bien. Mais j'ai ajouté le constructeur et le code ne compile plus. L'erreur est:

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  

J'ai donc deux questions:

  1. Pourquoi Lombok @Builder pas compatible avec ce constructeur?
  2. Comment puis-je compiler le code en tenant compte du fait que j'ai besoin à la fois du constructeur et du constructeur?
7
IKo

Vous pouvez soit ajouter une annotation @AllArgsConstructor, Car

@Builder Génère un constructeur all-argssi aucun autre constructeur n'est défini.

(Citant @Andrew Tobilko)

Ou définissez un attribut sur @Builder: @Builder(toBuilder = true) Cela vous donne la fonctionnalité d'un constructeur de copie.

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

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

Lorsque vous fournissez votre propre constructeur, Lombok ne crée pas de c-tor avec tous les arguments que @Builder utilise. Vous devez donc simplement ajouter une annotation @AllArgsConstructor à votre classe:

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

Vraisemblablement, @Builder génère un constructeur all-args ssi aucun autre constructeur n'est défini.

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

    private String mail;
    private String password;

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