Language intermediate

Compact canonical constructor

Validate and normalize record fields without repeating parameter lists.

✕ Java 16
public record Person(String name,
                     List<String> pets) {
    // Full canonical constructor
    public Person(String name,
                  List<String> pets) {
        Objects.requireNonNull(name);
        this.name = name;
        this.pets = List.copyOf(pets);
    }
}
✓ Java 16+
public record Person(String name,
                     List<String> pets) {
    // Compact constructor
    public Person {
        Objects.requireNonNull(name);
        pets = List.copyOf(pets);
    }
}
✂️

Less repetition

No need to repeat parameter list or assign each field manually.

🛡️

Validation

Perfect for null checks, range validation, and defensive copies.

📖

Clearer intent

Compact syntax emphasizes validation, not boilerplate.

Old Approach
Explicit constructor validation
Modern Approach
Compact constructor
Since JDK
16
Difficulty
intermediate
Compact canonical constructor
Available

Widely available since JDK 16 (March 2021)

Records can declare a compact canonical constructor that omits the parameter list and field assignments. The compiler automatically assigns parameters to fields after your validation logic runs. This is ideal for precondition checks, defensive copies, and normalization.

Share 𝕏 🦋 in