使用私有构造函数强化singleton属性

使用私有构造函数强化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静态工厂方法返回该类的唯一实例,但是,他也很容易被修改,比如说,为每个调用方法的线程返回一个唯一的实例。

你可能感兴趣的:(jvm)