用私有构造器或者枚举类型强化Singleton 属性
实现Singleton有两种常用方法
第一种
public class User {
//定义为final的,保证只有一份实例化
public static final User INSTANCE = new User();
//将构造器私有,防止通过构造器创建对象
private User(){
//防止通过反射机制来调用私有构造器
throw new RuntimeException("单例模式不允许使用使用私有构造器创建对象");
}
public static void main(String[] args) {
//实例化User对象通过调用INSTANCE来保证单例
User user = User.INSTANCE;
}
}
第二种
public class User {
//定义为final的,保证只有一份实例化
private static final User INSTANCE = new User();
//将构造器私有,防止通过构造器创建对象
private User(){
//防止通过反射机制来调用私有构造器
throw new RuntimeException("单例模式不允许使用使用私有构造器创建对象");
}
public static User getInstance() {
return INSTANCE;
}
private Object readResolve() {
//防止反序列化的时候有假冒的单例类
return INSTANCE;
}
public static void main(String[] args) {
//实例化User对象通过静态工厂来保证单例
User user = User.getInstance();
}
}
第三种
使用枚举,这种方式可以防止反序列和反射攻击,是单例模式的最佳实践.
public enum UserEnum {
INSTANCE;
}