Compact canonical constructor
Validate and normalize record fields without repeating parameter lists.
Code Comparison
✕ 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);
}
}
Why the modern way wins
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
JDK Support
Compact canonical constructor
Available
Widely available since JDK 16 (March 2021)
How it works
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.
Related Documentation