法一:公有静态成员final域
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
}
优势:API很容易知道这是一个单例类,更简单
注意:调用者可以借助AccessbleObject.setAccssible方法通过反射机制调用私有构造器,因此如果想抵御这种攻击,可以修改构造器,让它在被要求建第二个实例的时候抛出异常
法二:公有的成员是静态工厂方法
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public static Elvis getInstance(){
return INSTANCE;
}
}
优势:我们可以在不改变API的前提下改变该类是否成为单例类的想法,更加的灵活