java中的枚举单例

在相关程序中,我们经常会用到一些类管理相关资源或者时工具类。这些类有的可以使用单例模式,单例模式确保在同一个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;
    }
}

你可能感兴趣的:(java,基础)