简介
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》中指出:枚举是实现单例的最佳方式。因为它天然解决了线程安全、反射攻击和序列化问题,且代码极其简洁。除非在必须继承的场景下,否则应优先使用枚举实现单例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。