使用枚举enum实现单例模式

本文介绍了单例模式的两种实现方式——懒汉模式和饥饿模式,并探讨了如何通过反射破坏单例模式,最后介绍了一种更安全的实现方式——枚举单例。

单例模式的实现:

1, 普通模式:

public class SingleDemo {
	private static SingleDemo instance;
	
	private SingleDemo() {}
	
	public SingleDemo getInstance() {
		if (instance == null) {
			instance = new SingleDemo();
		}
		
		return instance;
	}
}


以上模式为懒汉模式

可以改造为饥饿模式,即Class加载即new对象

public class SingleDemo {
	private static SingleDemo instance = new SingleDemo();
	
	private SingleDemo() {}
	
	public SingleDemo getInstance() {
		return instance;
	}
}


上述方法可以可以通过反射,突破单例模式。


可以使用 enum方式实现

public enum SingleDemoEnum {
INSTANCE;
	
	public  void method() {
		// do work.
	}
}


### 枚举类型实现单例模式 在 Java 中,枚举类型(`enum`)可以通过其语言特性来实现单例模式。这种实现方式不仅简单而且安全,能够防止反序列化攻击以及反射机制破坏单例的完整性。 #### 定义枚举单例 以下是一个典型的枚举单例模式的定义: ```java public enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println("执行某些操作..."); } } ``` 上述代码中,`SingletonEnum` 是一个枚举类型,其中 `INSTANCE` 是它的唯一实例。由于枚举类型的特殊性,在 JVM 加载时会自动创建并初始化此实例,并且无法通过其他方式再创建新的实例[^1]。 #### 调用方法示例 下面展示了如何使用枚举单例模式中的实例及其方法: ```java package java_mode_06; public class Main { public static void main(String[] args) { // 获取单例实例 SingletonEnum singleton = SingletonEnum.INSTANCE; SingletonEnum singleton1 = SingletonEnum.INSTANCE; // 执行方法 singleton.doSomething(); // 验证是否为同一个实例 System.out.println("单例1:" + singleton); System.out.println("单例2:" + singleton1); // 对比非单例对象的行为 Test test = new Test(); Test test1 = new Test(); System.out.println("非单例1:" + test); System.out.println("非单例2:" + test1); } } class Test {} ``` 运行以上程序后,输出的结果如下所示: ``` 执行某些操作... 单例1:SingletonEnum.INSTANCE 单例2:SingletonEnum.INSTANCE 非单例1:Test@<hashcode> 非单例2:Test@<another_hashcode> ``` 可以看到,无论多少次访问 `SingletonEnum.INSTANCE`,得到的始终是同一个实例;而普通的类则每次都会生成不同的新实例[^2]。 #### 序列化的安全性 当涉及到对象的序列化与反序列化时,传统的单例模式可能会被破坏,因为反序列化过程通常会产生一个新的实例。然而,对于枚举类型的单例来说,即使经过反序列化处理,仍然只会返回原始的那个单一实例。这是因为 JDK 的内部机制已经针对这种情况进行了优化——即任何尝试重新构建枚举实例的操作都将失败,转而返回已存在的那个枚举成员[^3]。 如果需要进一步增强对序列化场景的支持,《Effective Java》一书中提到可以在必要情况下覆盖 `readResolve()` 方法以确保实例控制的有效性。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值