gpt4 book ai didi

Java:如何存储对一个类的所有实例的引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:07 25 4
gpt4 key购买 nike

我更习惯于 C++。要获得一个类的所有实例的列表(这是一个可以由用户扩展的库类),我通常有一个静态容器,其中包含对此类对象的所有引用:

#include <list>
class CPPClass;

class CPPClass {
public:
CPPClass() {
objList.push_back(this);
}
~CPPClass() {
objList.remove(this);
}

private:
static std::list<CPPClass *> objList;
};

std::list<CPPClass *> CPPClass::objList;

我应该如何在 Java 中做同样的事情?我有一些顾虑:

  • 有人向我提到可以有多个类加载器,这可能会导致问题
  • java 中没有析构函数,那么如何从列表中删除引用?
  • 如果不删除引用,这些对象何时会被垃圾回收?

最佳答案

首先要简单:除非您使用非标准委托(delegate)模式(使用自定义类加载器),否则多个类加载器不会给您带来问题。如果你确实有这样一个非标准的类加载器,你可能会遇到这样一种情况,即应用程序的不同部分使用不同版本的 CPPClass 类(每个版本来自不同的类加载器)。这有很多问题(你可以从 CPPClassCPPClass 得到一个 ClassCastException 转换!),但它不应该影响你的静态集合;每个 CPPClass 都有自己独立的集合。

下一步:不要从构造函数中将对象添加到集合中。从构造函数中泄漏 this 引用会导致内存模型问题。相反,您应该创建一个静态工厂方法来创建对象,然后单独将其添加到静态集合中。当然,该集合也应该是线程安全的。

最后是核心问题。如果每个对象都不等于任何其他对象(也就是说,如果您没有覆盖 Object.equals),您可以使用 WeakHashMap ,以对象为键。如果该类确实覆盖了 equals,您可以创建 WeakReference 的集合s,您可以在方便的时候对其进行修剪(插入时、检索列表时等)。 WeakReference 不会阻止它引用的对象被 GC 处理——它只会在 GC 发生后从 get 返回 null

但如果我可以编辑一下,像这样的“解决方案”通常暗示一个定义不明确的对象生命周期,它还有其他可维护性问题。如果您的对象实现 Closeable 或使用类似的方式让使用它们的代码声明它已完成,那可能会更好。

关于Java:如何存储对一个类的所有实例的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906909/

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