10 votes

Avec la nouvelle fonctionnalité Java 14 Record, est-il possible de créer plusieurs constructeurs pour le même Record ?

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 ?

17voto

Alex Shesterov Points 3733

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");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X