第3条 用私有构造器或者枚举类型强化Singleton属性
Singleton指仅仅被实例化一次的类。Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。
方法一:
// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
pirvate Elvis() {}
public void leaveTheBuilding() {....}
}
一旦Elvis类被实例化,只会存在一个Elvis实例。客户端的任何行为都不会改变这一点,但享有特权的客户端可以借组AccessibleOblect.setAccessible方法,通过反射机制调用私有构造器。
方法二:
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {}
public static Elvis getInstance() {
return INSTANCE;
}
public void leaveTheBuilding() {...}
}
公有域方法的好处: 组成类都成员声明很清楚的表明了这个类是一个Singleton。
工厂方法的优势: 它提供了灵活性,在不改变API的前提下,我们可以改变该类是否应该为Singleton的想法。
方法三:编写一个包含单个元素都枚举类型。
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
}
这种方法在功能上与公有域方法相近,但是它更加简洁,无偿地提供了序列号机制,绝对防止多次实例化。
单元素的枚举类型已成为实现Singleton的最佳方法。