3.用私有构造器或枚举类型强化SIngleton属性
Singleton指仅仅被实例化一次的类。
实现Singleton的两种方法:
1.
// Singleton with public final fieldpublic class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... }}
?
2.
// Singleton with static factorypublic class Elvis {private static final Elvis INSTANCE = new Elvis();private Elvis() { ... }public static Elvis getInstance() { return INSTANCE; }public void leaveTheBuilding() { ... }}
??注意:可以借助AccessibleOBject.setAccessible方法,通过反射机制访问私有构造器,因此要修改构造器,让它在被要求创建第二个实例时抛出异常
对于序列化:使用以上任何一种方法,如果要实现序列号,不能单单实现序列号接口,还必须声明所有实例域都是瞬时的(transient),并且提供一个readResolve方法,否则每次反序列化的时候都会创建一个新的实例。
3.Java1.5以后还有第三种方法,使用枚举类型来实现
// Enum singleton - the preferred approachpublic enum Elvis {INSTANCE;public void leaveTheBuilding() { ... }}?这种方法更简洁,无偿提供了序列号机制,防止多次实例化,单元素枚举已经成为实现SIngleton的最佳实践。
?