第二条:使用私有构造函数强化Singleton属性
Singleton是指这样的类,它只能实例化一次。通常代表本质上具有唯一性的系统组件,如视频文件或文件
系统。
实现Singleton的两种常用方法:(目地都是把构造函数保持为私有,并且提供一个静态成员,以便客户
能够访问该类唯一的实例)
1、用一个公有的静态final成员,返回受保护的构造函数。
public class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
.........}
}
好处:成员的声明清楚地表明了这个类是一个singleton,公有的静态final域总是包含相同的对象引用。
2、提供一个公有的静态工厂方法。
public class Elvis{
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
.........}
public static Elvis getInstance() {
return INSTANCE;
}
}
好处:它提供了灵活性:在不改变API的前提下,我们可以把该类做成singleton的或不做成singleton。
而且静态工厂方法返回的唯一实例也很容易被修改。
第三条:通过私有构造函数强化不可实例化的能力
不可实例化我理解为一些只包含静态方法和静态域的工具类,比如
java.lang.Math,java.util.Arrays,java.util.Collections
只有当一个类不包含显式的构造函数的时候,编译器才会生成默认构造函数,所以,我们只要让这个类包
含单个显式的私有构造函数,这样它就不可被实例化了,哈哈。
public class UtilityClass {
private UtilityClass (){
........}
}
这样这个不能被子类化的类的构造函数必须要调用一个可访问的超类构造函数,显式或隐式地。