java中的枚举单例

8 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值