Java:如何存储对类的所有实例的引用? 我更习惯于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; #包括 类cpp类; 类CPP类{ 公众: CPPClass(){ 对象列表。推回(此); } ~cppglass(){ 对象列表。删除(此); } 私人: 静态标准::列表对象列表; }; std::list cppcclass::objList;

Java:如何存储对类的所有实例的引用? 我更习惯于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; #包括 类cpp类; 类CPP类{ 公众: CPPClass(){ 对象列表。推回(此); } ~cppglass(){ 对象列表。删除(此); } 私人: 静态标准::列表对象列表; }; std::list cppcclass::objList;,java,static,garbage-collection,Java,Static,Garbage Collection,我应该如何在Java中执行同样的操作?我有几点担心: 有人向我提到可以有多个类加载器,这可能会导致问题 java中没有析构函数,那么如何从列表中删除引用呢 如果没有删除引用,这些对象什么时候会被垃圾回收 确实可以将列表设置为静态,只需确保正确初始化即可 List<CPPClass> objlist; static { objlist = new List<CPPClass>(); } 列表对象列表; 静止的{ objlist=新列表(); } 或者类似的东西

我应该如何在Java中执行同样的操作?我有几点担心:

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

确实可以将列表设置为静态,只需确保正确初始化即可

List<CPPClass> objlist;
static {
    objlist = new List<CPPClass>();
}
列表对象列表;
静止的{
objlist=新列表();
}
或者类似的东西可以做到这一点

如果不删除引用,它将永远不会被垃圾回收,因为垃圾回收器将假定该对象仍在使用中


有些东西看起来有点像析构函数:方法
finalize
。但是,由于此方法仅由垃圾收集器调用,并且您自己不能使用它,因此它对您没有任何用处。

而不是存储对对象的引用,将a存储到对象-这样,如果WeakReference是剩下的唯一引用,垃圾收集器将释放该对象。

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

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

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


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

存储到对象以允许它们被垃圾收集。我想我不能依赖
equals
方法不被覆盖,因为用户可以做任何他们想做的事情。。。除非我能把它定下来,但我想那太严格了。。。此外,我应该在
WeakHashMap
的值中输入什么?因此,我想我要么留下了类似于
WeakArrayList
(有这样的东西吗?)的东西,要么自己实现容器(我猜在Java中它被称为collection?)。实现
Closeable
,虽然看起来像是回到了一种熟悉的编程方式,但这是理想的Java解决方案吗?实现Closeable(或者如果您使用Java 1.7并希望使用AutoCloseable)绝对是惯用的Java。很多JDK类都是这样做的——InputStream、JDBC类等等。如果您确实想使用自己的集合,我将从
列表开始。我不会从头开始实现我自己的集合,只是使用JDK集合并手动遍历它来清除过时的weakreference。