gpt4 book ai didi

java - 使 Singleton 类对象的实例符合 GC 的条件

转载 作者:行者123 更新时间:2023-12-02 04:31:30 25 4
gpt4 key购买 nike

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

枚举初始化后,我的系统中不再需要 JAXBReader 的 objetc。我怎样才能实现这个目标?

我读到here我可以调用 setter 将 null 分配给静态 singleton 实例,但我不想在外部执行此操作。我希望实例在枚举初始化后自动分配为 null。

我使用的是 Java 1.7

最佳答案

一种选择是在枚举的静态初始值设定项内完成所有这些操作。在枚举本身中保留一个静态字段,编写一个私有(private)静态方法来获取文件的内容,必要时读取它,然后在枚举初始化结束时 - 在静态初始化程序 block 中 - 将其设置为 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;
}
}

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

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

关于java - 使 Singleton 类对象的实例符合 GC 的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31398468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com