J'ai un certain nombre de classes de "données" qui utilisent Lombok et je veux toutes les migrer pour utiliser la nouvelle fonctionnalité Record disponible dans Java 14. Avec la nouvelle fonctionnalité Record de Java 14, est-il possible de créer plusieurs constructeurs pour le même Record ? Si ce n'est pas le cas, existe-t-il une alternative ?
Réponse
Trop de publicités?Depuis Java 15 (voir JEP 384 : Dossiers (deuxième aperçu) ), vous pouvez avoir plusieurs constructeurs dans les enregistrements .
Cependant, chaque constructeur doit déléguer au constructeur canonique de l'enregistrement qui peut être définie explicitement ou générée automatiquement.
Un exemple :
public record Person(
String firstName,
String lastName
) {
// Compact canonical constructor:
public Person {
// Validations only; fields are assigned automatically.
Objects.requireNonNull(firstName);
Objects.requireNonNull(lastName);
// An explicit fields assignment, like
// this.firstName = firstName;
// would be a syntax error in compact-form canonical constructor
}
public Person(String lastName) {
// Additional constructors MUST delegate to the canonical constructor,
// either directly:
this("John", lastName);
}
public Person() {
// ... or indirectly:
this("Doe");
}
}
Autre exemple :
public record Person(
String firstName,
String lastName
) {
// Canonical constructor isn't defined in code,
// so it is generated implicitly by the compiler.
public Person(String lastName) {
// Additional constructors still MUST delegate to the canonical constructor!
// This works:
this("John", lastName);
// (Re-)Assigning fields here directly would be a compiler error:
// this.lastName = lastName; // ERROR: Variable 'lastName' might already have been assigned to
}
public Person() {
// Delegates to Person(String), which in turn delegates to the canonical constructor:
this("Doe");
}
}