在相关程序中,我们经常会用到一些类管理相关资源或者时工具类。这些类有的可以使用单例模式,单例模式确保在同一个class loader里面只有一个实例对象,这样就可以保证对资源管理的准确性,当然这些话都是我个人理解的,纯属胡说八道。那么大家都知道实现单例模式有五种方式,今天我们单独说下枚举实现单例的方式/
献上代码:
public enum SourceManagerEnum { 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; }}
新闻热点
疑难解答