Skip to content
Advertisement

With the new Java 14 Record functionality, is it possible of creating multiples constructors for the same Record?

I have a bunch of “data” classes using Lombok and I want to migrate all of them to use the new Record functionality available in Java 14. With the new Java 14 Record functionality, is it possible of creating multiples constructors for the same Record? If not, is there an alternative?

Advertisement

Answer

With Java 14, records couldn’t have multiple constructors (reference: Java 14 – JEP 359: Records (Preview)).

As of Java 15 and 16+, records may have multiple constructors. (see Java 15 – JEP 384: Records (Second Preview) and Java 16 – JEP 395: Records (Final)).

However, every constructor must delegate to the record’s canonical constructor which can be explicitly defined or auto-generated.

An example:

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

Another example:

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

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement