Static member thuộc về class, không phải instance.
Hình dung: private int balance là số dư riêng từng tài khoản; static int totalAccounts là một biến duy nhất dùng chung cho mọi Account.
class Counter {
static int total = 0; // dùng chung
int instanceCount = 0; // riêng từng object
Counter() { total++; instanceCount++; }
static int getTotal() { return total; } // gọi: Counter.getTotal()
}Khi nên dùng:
- Utility/helper: Math.abs(), Collections.sort().
- Hằng số: static final int MAX_SIZE = 100;.
- Factory method: LocalDate.now(), List.of(...).
Bẫy cần tránh:
- Khó test: static khó mock — phải dùng mockStatic (chậm, tăng coupling).
- Không polymorphic: static method không override được, chỉ hide.
- Trạng thái toàn cục: mutable static = global state → khó debug, dễ leak giữa test.
- Memory leak: static Map cache không có evict → phình mãi.
Quy tắc: static phù hợp cho pure function + immutable constant. Nghi ngờ thì chuyển sang DI để dễ test.