在相关程序中,我们经常会用到一些类管理相关资源或者时工具类。这些类有的可以使用单例模式,单例模式确保在同一个class loader里面只有一个实例对象,这样就可以保证对资源管理的准确性,当然这些话都是我个人理解的,纯属胡说八道。那么大家都知道实现单例模式有五种方式,今天我们单独说下枚举实现单例的方式/
献上代码:
SINGLEINSTANCE;
private T instance;// T 代表 相应的类型
// JVM 保证这个方法在整个生命周期只调用一次
private SourceManagerEnum() {
instance = new T();
}
public T getInstance() {
return instance;
}
}然后我们在别的对象里面就可以使用单例了。
T instance = SourceManagerEnum.SINGLEINSTANCE.getInstance();
注意事项,在T类中的构造函数一定要设置成private ,这个大家都明白
最后一点,为什么推荐使用枚举单例模式,因为这样可以防止反射攻击。
Class cl = Class
.forName("XXXXX.SingleUtil");
SingleUtil instance1 = (SingleUtil) cl.newInstance();
SingleUtil instance2 = SingleUtil.getInstance();
System.out.println(instance1 == instance2);
这样一段代码输出的结果是什么呢。
因为枚举在反射的时候就会报错。。。。。。。。(纯属大雾,还是需要大家自己验证)
Class cl = Class
.forName("XXXX.SingleEnumReflect");
if (cl.isEnum()) {
SingleEnumReflect[] ts = (SingleEnumReflect[]) cl
.getEnumConstants();
for (SingleEnumReflect singleEnumReflect : ts) {
System.out
.println(singleEnumReflect.getInstance() == SingleEnumReflect.Instance
.getInstance());
}
}
SingleEnumReflect 枚举的代码如下。猜猜上面输出什么?
public enum SingleEnumReflect {
Instance;
private TextFilterTest textFilter;
private SingleEnumReflect() {
}
public TextFilterTest getInstance() {
return textFilter;
}
}