Immutable class = object không đổi trạng thái sau khi tạo. Quy tắc viết:
1. Class khai báo final — chặn subclass override method làm lộ/đổi state.
2. Mọi field private final.
3. Không có setter — state chỉ gán 1 lần qua constructor.
4. Field là mutable object (List, Date, mảng...) → defensive copy cả 2 chiều: copy khi nhận vào constructor, copy (hoặc bọc List.copyOf()/unmodifiable) khi trả ra từ getter — nếu không, bên ngoài giữ reference gốc vẫn sửa được.
5. Muốn "sửa" → trả object mới (kiểu String.replace(), LocalDate.plusDays()).
Lợi ích: thread-safe tự nhiên (không cần lock), an toàn làm key HashMap/element của Set, dễ reason và cache.
Có sẵn trong JDK: String, wrapper (Integer, Long...), BigDecimal, LocalDate/LocalDateTime.
Java 16+: dùng record — immutable gọn nhất (tự sinh constructor, accessor, equals/hashCode) — nhưng vẫn phải tự lo defensive copy nếu component là mutable.