简介

Singleton模式确保一个类只有一个实例,并提供全局访问点。在Java中,有几种实现Singleton的方式,其中使用私有构造器或枚举类型是最推荐的方法。

实现

使用私有构造器

1.饿汉式

举个例子 🌰

public class Singleton {
    // 类加载时就初始化实例
    public static final Singleton INSTANCE = new Singleton();

    private Singleton() {};

    // 提供外部访问方法
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2.懒汉式

举个例子 🌰

public class Singleton {
    private static final Singleton INSTANCE;
    
    // 私有构造器,防止外部实例化
    private Singleton() {
        // 防止反射攻击
        if (instance != null) {
            throw new IllegalStateException("单例实例已存在");
        }
    }
    
    // 提供外部访问方法
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // 防止反序列化破坏单例
    protected Object readResolve() {
        // 直接返回已存在的单例实例
        return getInstance();
    }
}

使用枚举类型

Java 枚举天然支持单例,由 JVM 保证线程安全、防止反射攻击,且自动处理序列化/反序列化。
举个例子 🌰

public enum EnumSingleton {
    INSTANCE;
}

总结

在《Effective Java》中指出:枚举是实现单例的最佳方式。因为它天然解决了线程安全、反射攻击和序列化问题,且代码极其简洁。除非在必须继承的场景下,否则应优先使用枚举实现单例。


我爱吃炒煤
1 声望0 粉丝