`

java singleton

阅读更多

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;
}
  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics