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