传统单例
private 构造函数
最优单例实现:使用Enum
1.无需担心序列化
先说说传统单例,其如果序列化再反序列化产生的效果和构造一个新的对象差不多的。除非增加以下来阻止:
//readResolve to prevent another instance of Singleton
private Object readResolve(){
return INSTANCE;
}
而Enum自身源码中已实现防护代码:
/**
* prevent default deserialization
*/
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
}
private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
2.无需double-check,方便安全
并且枚举创建的单例在JVM层面上也能保证实例是thread-safe的。
/**
* Singleton pattern example using Java Enumj
*/
public enum EasySingleton{
INSTANCE;
}
使用单例的时候用EasySingleton.INSTANCE 就可以了。