一个完美的单例模式应该实现什么样的功能呢?
(1)单例
(2)延迟加载
(3)线程安全
(4)没有性能问题
(5)防止序列化产生新对象
(6)防止反射攻击
在《Effective Java》一书中指出,能完美满足这些要求的单例模式的写法为利用Java的枚举类型来帮助实现单例模式
public enum MyInstance {
INSTANCE;
private int num = 0;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
然后只需要利用MyInstance.INSTANCE便可以获得这个单例,并调用里面的方法。
这样利用枚举类型的方法实现的单例模式非常简洁而且优雅,比调用getInstance()方法简单多了。与此同时,由于创建枚举默认就是线程安全的,因此不需要使用双重检验锁,而且还能防止反序列化、防止他人利用Java的反射机制导致重新创建新的对象。