Đặt constructor private để cấm bên ngoài new trực tiếp, giành lại quyền kiểm soát cách tạo object. Các trường hợp dùng:
- Utility class toàn
static(nhưMath,Collections): private constructor để không ai lỡnew. - Singleton: chỉ một instance, lấy qua
getInstance(). - Static factory method:
User.of(...)thaynew User(...)— tên rõ nghĩa, có thể cache hoặc trả subtype (Effective Java Item 1). - Builder pattern: ép người dùng đi qua builder.
java
public final class Math {
private Math() {} // không cho khởi tạo
public static int abs(int a) { /* ... */ }
}Bản chất: private constructor = "class này tự quyết định vòng đời object của chính nó", không nhường cho caller.
Với utility class, thêm throw new AssertionError() trong constructor để chặn cả reflection.