用私有构造器或者枚举类型enum强化singleton

本文介绍使用枚举实现单例模式的方法,这种方式简洁且具备序列化机制,能有效防止多次实例化,即使面对序列化和反射攻击也能保持单一实例。枚举单例模式不仅线程安全,还克服了其他单例实现方式的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Singleton {
	
	private static Singleton instance = new Singleton();
	private Singleton() { }
	
	public static Singleton getInstance() {
		return instance;
	}
	
	public void service() {
		System.out.println("Singleton.service...");
	}
	
	public static void main(String[] args) {
		
		EnumSingleton singleton = EnumSingleton.INSTANCE;
		singleton.setName("enum singleton");
		singleton.service();
		
		Singleton.getInstance().service();
	}

}

enum EnumSingleton implements Serializable {
	
	INSTANCE;
	
	private String name = "default";
	public void setName(String name) {
		this.name = name;
	}

	public void service() {
		System.out.println("EnumSingleton.service..." + this.name);
	}
}

 

 * 用私有构造器或者枚举类型enum强化singleton:
   enum Sigleton 在功能上与静态工厂方法相近,但它更简洁,无偿地提供了序列化机制,绝对防止多次实例化,

   即使是在面对复杂的序列化和反射攻击的时候。
   单元素的enum已经成为实现Singleton的最佳方法。
   1.线程安全

   2.不会因为序列化而产生新实例

   3.防止反射攻击

 * enum默认extends Enum类,所以不能再extends其他类,只能通过接口扩张。
   因为一个enum常量(这里是INSTANCE)代表了一个enum的实例,enum类型只能有这些常量实例。
   标准保证enum常量(INSTANCE)不能被克隆,也不会因为反序列化产生不同的实例,想通过反射

   机制得到一个enum类型的实例也不行的。 

 * 如果用一般方式写单例模式,该单例类如果实现了Serializable接口,则必须添加readResolve()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值