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