这是一个简单的单例但是存在序列化和反射的问题 , 通过对其序列化或者反射会得到全新的对象。
public class Single implements Serializable{
private static final Single SINGLE = new Single();
private Single() {
}
private Single getInstance() {
return SINGLE;
}
}
反射问题解决: 在构造器中抛出异常 (单例初始化时运行构造方法Single() 时 SINGLE 一定为null,且单例Single()只能在第一次运行时创建对象,再次运行时SINGLE 不为null就返回异常保证单例只初始化一次)
private Single() {
if (SINGLE != null) {
throw new RuntimeException();
}
}
序列化问题解决:添加readResolve() 方法 序列化会调用readResolve() 方法返回SINGLE对象。
private Object readResolve() throws ObjectStreamException {
return SINGLE;
}
单例推荐使用枚举枚举已经帮助我们解决了序列化与反射的问题,枚举实际是一个抽象类。
public enum SingleEnum {
INSTANCE;
public void say(){
System.out.println(" say ");
}
}