Record (Java 16+ — JEP 395) là class đặc biệt cho dữ liệu bất biến.
Một dòng thay 50 dòng POJO.
public record Person(String name, int age) {}
// Tương đương ~50 dòng POJO với constructor + getter + equals + hashCode + toStringCompiler tự sinh: constructor canonical, accessor name() / age() (không có "get"), equals / hashCode / toString, field ngầm private final.
Tuỳ biến qua compact constructor:
public record Person(String name, int age) {
public Person { // compact constructor
if (age < 0) throw new IllegalArgumentException("age >= 0");
name = name.trim();
}
public boolean isAdult() { return age >= 18; } // method tự định nghĩa
}Khi nên dùng:
- DTO chuyển dữ liệu giữa layer.
- API request/response (Spring Boot 3 hỗ trợ Jackson + Validator).
- Value object DDD: Money, Coordinate, EmailAddress.
- Map key / Set element.
Hạn chế:
- Không extends class khác — chỉ implements interface.
- Implicitly final, không subclass được.
- Không phù hợp JPA entity (cần setter + no-arg constructor).
Record Patterns (Java 21): bóc field ngay trong pattern matching:
if (shape instanceof Circle(double r)) return Math.PI * r * r;Tóm lại: record là default cho immutable data; class truyền thống chỉ khi cần state mutable hoặc framework yêu cầu.