繁体   English   中英

使Singleton Class对象的实例符合GC条件

[英]Make instance of Singleton Class object eligible for GC

我有一个类JAXBReader ,它使用jaxb生成的类保存未编组的xml文件。 我使用了单例设计,因此无需一次又一次地解组文件。 仅需要使用此类的对象(准确地说是未编组的xml)来初始化具有八个常量的枚举。 枚举常量的构造函数使用单例对象获取xml的必需部分。

枚举初始化后,我的系统中不需要JAXBReader的JAXBReader 我该如何实现?

在这里阅读可以调用setter来为静态singelton实例分配null,但我不想在外部进行。 我想要的是,在枚举初始化后,实例自动分配为null。

我正在使用Java 1.7

一种选择是在枚举的静态初始化器中完成所有这些操作。 在枚举本身中保留一个静态字段,编写一个私有的静态方法来获取文件的内容,如有必要,读取它,然后在枚举初始化结束时(在静态初始化程序块中)将其设置为null:

public enum Foo {
    VALUE1, VALUE2, VALUE3;
    private static JAXBReader singleReader;

    static {
        singleReader = null; // Don't need it any more
    }

    private Foo() {
        JAXBReader reader = getReader();
        // Use the reader
    }

    private static JAXBReader getReader() {
        // We don't need to worry about thread safety, as all of this
        // will be done in a single thread initializing the enum
        if (singleReader == null) {
            // This will only happen once
            singleReader = new JAXBReader(...);
        }
        return singleReader;
    }
}

这样,只有枚举才知道读取器是一个单例-您仍然可以JAXBReader在外部喜欢时创建一个新的JAXBReader ,这对于测试非常有用。

(我对于枚举初始化需要外部资源感到有些紧张,但是我可以看到它很难避免。)

使用WeakReference来保存对象。

private static WeakReference<JAXBReader> instance = null;

public static JAXBReader getInstance() {
    if (instance.get() == null) {
        instance = new WeakReference(new JAXBReader());
    }
    return instance.get();
}

这样,如果不存在其他参考,它将被GC化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM