实现Singleton的两种方式

法一:公有静态成员final域

public class Elvis {

    public static final Elvis INSTANCE = new Elvis();
    private  Elvis() {}
    public static Elvis getInstance(){
        return INSTANCE;
    }
}

优势:API很容易知道这是一个单例类,更简单

注意:调用者可以借助AccessbleObject.setAccssible方法通过反射机制调用私有构造器,因此如果想抵御这种攻击,可以修改构造器,让它在被要求建第二个实例的时候抛出异常

法二:公有的成员是静态工厂方法

public class Elvis {

    private static final Elvis INSTANCE = new Elvis();

    public Elvis() {
    }
    public static Elvis getInstance(){
        return INSTANCE;
    }
}
优势:我们可以在不改变API的前提下改变该类是否成为单例类的想法,更加的灵活

猜你喜欢

转载自blog.csdn.net/qq_23834457/article/details/89152822