java singleton

本文介绍了Java中的Singleton模式,包括其实现方法及如何确保其在序列化过程中的唯一性。主要探讨了通过私有构造函数和静态成员来实现Singleton的两种方式。

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

Java singleton是指这样的类,它只能实例化一次,singleton通常被用来代表那些本质上具有唯一性的系统组件。

  实现singleton有两种方法:这两种方法都要把构造函数保持为私有的,并且提供一个静态成员,以便允许客户能够访问该类唯一的实例。

  第一种方法,共有静态成员是一个final域:

// Singleton with final field
public class Singleton {
	private static final Singleton _INSTANCE = new Singleton();
	
	private Singleton(){}
}



  私有构造函数仅被调用一次,用来实例化共有的静态final域Singleton._INSTANCE,由于缺少public或者protected构造 函数,所以保证了Singleton的全局唯一性,一旦Singleton类被实例化之后,只有一个Singleton实例存在,客户的任何行为都不会改 变这一点。

  第二种方法提供了一个公有的静态工厂方法,而不是公有的静态final域:

 
// Singleton with static method
public class Singleton {
	private static final Singleton _INSTANCE = new Singleton();
	
	private Singleton(){}
	
	public synchronized static Singleton getInstance() {
		return _INSTANCE;
	}
}
  


 
  所有对于静态方法Singleton._INSTANCE的调用,都会返回同一个对象引用,所有,不会有别的Singleton实例被创建。

  第二种方法的好处在于利用JVM特性(内联)来提高了点效率。

  如果遇到需要Singleton类变成可序列化(serializable),仅仅在声明中加上"implements Serializable"是不够的,为了维护singleton性,必须提供一个readResolve方法,否则的话,一个序列化的实例在每次反序列 化的时候,都会导致创建一个新的实例,解决方法:

 
private Object readResolve() throws ObjectStreamException {
	return _INSTANCE;
}
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值