为何要使用枚举类实现单例模式,是因为枚举类可以避免序列化和反射实例化多个的情况。在序列化中,通过ObjectInputStream的readObject0()方法中可以看到调用了readEnum()方法,而readEnum是通过类名和类对象类找到一个唯一的枚举对象,找到后赋值返回。而反射的newInstance是直接不实例化枚举类的对象,会直接报“Cannot reflectively create enum objects”,即不能用反射来创建枚举类型。因此Effective JAVA书中推荐使用枚举类实现单例模式。实现代码如下
/**
* @author ZJX
* @date 2021/10/8
* @description
*/
public enum LazySingleton {
instance;
private User user;
LazySingleton(){
this.user = new User();
}
public User getUser() {
return user;
}
}