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

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()方法。

猜你喜欢

转载自jaesonchen.iteye.com/blog/2286878
今日推荐