Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tạo lớp Singleton trong Java

Singleton Pattern

Đảm bảo một class chỉ có một instance duy nhất trong toàn ứng dụng, cung cấp điểm truy cập toàn cục (global access point).

Cách phổ biến: Eager Initialization (Static Block)


public class SingletonEager {
    // 1. Static instance tạo ngay khi load class
    private static final SingletonEager INSTANCE = new SingletonEager();

    // 2. Private constructor ngăn new từ bên ngoài
    private SingletonEager() {}

    // 3. Public static method trả về instance
    public static SingletonEager getInstance() {
        return INSTANCE;
    }

    public void doSomething() {
        System.out.println("Singleton instance working...");
    }

    public static void main(String[] args) {
        SingletonEager s = SingletonEager.getInstance();
        s.doSomething();
    }
}

Kết quả

Singleton instance working...

Các biến thể khác

CáchĐặc điểm
Eager (static field/block)Đơn giản, thread-safe, tạo sớm (có thể lãng phí nếu không dùng)
Lazy (double-checked locking)Tạo khi cần, phức tạp, cần volatile + synchronized
Bill Pugh (Inner static class)Lazy, thread-safe, đơn giản, khuyến khích
Enum SingletonNgắn gọn, thread-safe, chống serialization/reflection attack

Enum Singleton (Best Practice hiện đại)


public enum SingletonEnum {
    INSTANCE;
    public void doSomething() { System.out.println("Enum Singleton"); }
}
// Dùng: SingletonEnum.INSTANCE.doSomething();

Khuyến nghị: Dùng enum cho Singleton trong Java ≥ 5. An toàn, ngắn gọn, tự xử lý serialization.