这一节,主要讲得是单例设计模式.关于单例设计模式的详细介绍,可以移步runoob:
http://www.runoob.com/design-pattern/singleton-pattern.html
Singleton指仅仅被实例化一次的类.
在Java1.5之前,实现Singleton有两种方法(饿汉式,懒汉式),这两种方法都将构造器保持为私有,并导出共有的静态成员.
有一点需要注意的是,不管事饿汉式,还是懒汉式,享有特权的客户端可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有构造器.如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常.
无论是饿汉式,还是懒汉式,想要变成可序列化(Serializable),仅仅在声明上”implements Serializable”是不够的.为了维护并保证Singleton,必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法.否侧,每次反序列化时,都会创建一个新的实例.
private Object readResolve(){
return INSTANCE;
}
在Java1.5之后,实现Singleton还有第三种方法.只需编写一个包含单个元素的枚举类型:
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){...}
}
这种方法在功能上与公有域方法相近,但是它更加简洁,无偿地提供了序列化机制,即便在面对复杂的序列化或者反射攻击的时候,也可以绝对防止多次实例化.