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:
@Builder
pas compatible avec ce constructeur?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();
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 {
//...
}
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);
}
}