首页 > 学院 > 开发设计 > 正文

java中的枚举单例

2019-11-14 12:41:01
字体:
来源:转载
供稿:网友

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


上一篇:快速排序

下一篇:3.5 斐波那契数

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表