使用私有构造函数强化singleton属性:
实现singleton有两种方法:这两种方法都要把构造函数保持为私有的,并且提供一个静态成员,以便允许客户能够访问该类唯一的实例:
第一种方法:
public class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis(){
...
}
...//Remainder omitted
}
第二种方法:
提供了一个公有的静态工厂方法,而不是公有的静态final域;
public class Elvis{
private static final Elvis INSTANCE = new Elvis();
private Elvis(){
...
}
public static Elvis genInstance(){
return INSTANCE;
}
...Remainder omitted
}
所有对于静态方法Elvis.getInstance()的调用,都会返回同一个对象引用,所以,不会有别的Elvis实例被创建。
第一种方法的好处在于,组成类的成员的声明很清楚地表明了这个类是一个singleton;公有的静态域是final的,所以该域将总是包含相同的对象引用。第一种方法可能在性能上稍微领先,但是在第二种方法中,一个优秀的JVM实现应该能够通过将静态工厂方法的调用内联化(inlining),来消除这种差别。
第二种方法的好处在于,它提供了灵活性;在不改变API的前提下,允许我们改变想法,把该类做出singleton,或者不做成singleton,singleton静态工厂方法返回该类的唯一实例,但是,他也很容易被修改,比如说,为每个调用方法的线程返回一个唯一的实例。