浅谈单例模式的几种写法

本文探讨了随着Java版本发展,单例模式的不同实现方法,包括传统的饿汉式、懒汉式以及更加安全的枚举单例。博主通过个人学习历程,分享了对单例模式的理解,并总结了三种主要的单例模式写法。

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

概述:随着jdk的版本的发展,单例模式的写法也随之增加并逐渐完善。博主从接触java就听到单例模式,闲来无事喜欢看杂七杂八的文章,今天看到枚举单例,突发感想记录下来。总结之,目前单例模式有三种写法。

一、最原始的单例模式写法

归纳起来三个步骤,静态方法、私有构造器、静态常量

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

如此单例模式就设计出来,如果考虑到线程安全的问题,getInstance可以如下写法

public static synchronized  A  getInstance(){
		return instance;
	}
第一种写法在序列化、反序列化上会产生多个对象,如此就违背了单例思想

二、改进的单例模式写法

public class B {
	private static final B instance = new B();
	
	private B(){
		
	}
	
	public static   B  getInstance(){
		return instance;
	}
	
	public Object readResolve(){
		return instance;
	}
}

添加readResolve()方法,防止序列化的时候出现多个实例

三、枚举单例模式

枚举单例写法需要jdk的配合,jdk1.5之后才可以这种写法

public enum TestSingleton {
	INSTANCE;
	
	TestSingleton(){
		
	}
	
}
这种写法既简洁,又能防止序列化出现多个实例。为三种方法中,博主最推荐的单例模式写法。

至于此种写法的序列化会不会出现多个实例的测试代码,博主就不写了,通过写入、读取的方式可以验证序列化前后的两个实例是同一个,相信大家可以自己写出这样的验证代码。

此文借鉴《effective java》






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值