用枚举类型实现Singleton属性是更好的选择
实现Singleton方式大概有三种
前两种,把构造器私有,导出公有静态成员
1. 公有静态成员是一个final域
需要考虑反射攻击问题
2. 公有静态成员是一个静态工厂方法
需要考虑序列化的问题,因为仅仅在声明上加上"implements Serializable"是不够的。必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法。否则,每次反序列化一个序列化的实例时,都会创建一个新的实例
第三种方法:枚举
在jdk 1.5版本后,只需编写一个包含单个元素的枚举类就可以实现Singleton
public enum Elvis { INSTANCE; public void leaveTheBuildings() { System.out.println("leave"); } }
调用时直接这样写:
Elvis.INSTANCE.leaveTheBuildings();
好处在于:
1. 更加简洁
2. 无偿提供序列化机制
3. 绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候
所以,总而言之,目前枚举是实现Singleton的最佳方法。