Java 如何存储对类的所有对象的引用?

Java 如何存储对类的所有对象的引用?,java,instance-variables,class-variables,Java,Instance Variables,Class Variables,假设有两个类,ObjectA和ObjectB。类ObjectA有一个创建类ObjectB对象的方法,如下所示: private ObjectB createObjectB() { Object b = new ObjectB(); return b; } 我想跟踪ObjectB的所有实例。有什么更好的方法可以做到这一点 以类ObjectA内的ArrayList形式跟踪所有对象 或者ObjectB中的某个类变量 每种方法的优缺点是什么?如果我知道ObjectB对象只能从Ob

假设有两个类,ObjectA和ObjectB。类ObjectA有一个创建类
ObjectB
对象的方法,如下所示:

private ObjectB createObjectB() {
    Object b = new ObjectB();
    return b;
 }
我想跟踪
ObjectB
的所有实例。有什么更好的方法可以做到这一点

  • 以类
    ObjectA
    内的
    ArrayList
    形式跟踪所有对象
  • 或者
    ObjectB
    中的某个类变量
每种方法的优缺点是什么?如果我知道
ObjectB
对象只能从ObjectA中的这一个方法创建,这会有什么不同吗


请注意,
ObjectA
只有一个实例,但是
ObjectB
的实例数是可变的。

如果只有一个
ObjectA
实例,并且它有一个
createB
方法,我会保留
ObjectA
实例本身的列表。但事实上,我认为这并不重要

public ObjectB createB(){
   Object B = new ObjectB();
   allBs.add(b); // assuming some sort of List
   return b;
}

我很想知道你为什么要这么做。根据应用程序及其体系结构的不同,您可能会遇到线程问题。

在ObjectB中保存一个列表没有意义,但如果您需要引用您创建的所有B对象,ObjectA中的列表将有意义。

您只需要“跟踪”如果希望从代码的不相关部分访问所有创建的对象,则可以使用这种方式创建对象。否则1)创建的对象将由变量保存,因此您可以访问它;2)当对象不再有引用(因此无法访问)时,垃圾收集器将最终清理内存


如果您确实跟踪了它们,请记住,当您拥有集合中的对象时,GC无法释放内存,这可能会导致内存不足错误,这取决于您需要实现什么。
ObjectB
(顺便说一句,这是个坏名字)的实例是否应该能够相互对话?如果是这样,那么您需要在类中创建一个全局变量(即
静态
字段),或者必须将列表保留在
ObjectA
中,并将其“注入”到
ObjectB
的每个实例中,这意味着您需要在两个位置都保留一个引用

如果
ObjectB
的实例不需要彼此对话,通常将列表保存在
ObjectA
中就足够了

但大多数情况下,根本不需要保存列表。这甚至可能是危险的,因为您必须确保列表在消耗所有内存之前不会增长

一般规则是:避免不必要的依赖关系。通过保存一个列表,您引入了一个有成本的依赖项(例如,在维护中,您首先需要编写代码)


要时刻提防你所写的东西的成本——很容易让这些廉价的东西积累成真正昂贵的依赖关系,这会扼杀你。

对我来说,对象A和对象C似乎是管理对象B实例的类

我有一个类似的场景,我需要跟踪不同的服务,这些服务是基本服务类的子类(在我的例子中,对象B是基类)

为了创建/启动/停止/重新启动/删除这些服务,我有两个用于两个不同目的的管理器类(如您的示例中的对象A和对象C)

在这两个管理器类中,我都有一个HashMap

您可以使用一种方法来停止/启动/创建/销毁/删除类a或C中的B对象,该对象采用对象B的“名称”,并在对象B上启动相应的操作


作为最佳实践,在SessionContextListener中,始终确保调用停止/删除操作来删除添加在此HashMap中的对象。

根据您对ObjectC的介绍,我认为ObjectA(和C)维护ObjectB数组最有意义。(事实上,如果你希望加减B,我建议使用某种集合而不是数组)

然后,您可以创建一个方法来返回由a创建的B的数量,例如a.countB()

如果您发现自己处于需要创建B的总数的位置,并且不能使用a.countB()+C.countB(),那么您有两个选项:在B中的静态映射,其中键是创建者对象(a、C或其他),值是B的集合

我不鼓励这样做有几个原因,主要是创建的对象会挂起(因此没有GC和潜在的内存问题)


另一种方法是使用管理器类来创建和跟踪B,并在完成实例后非常小心地取消引用。

这取决于为什么需要跟踪对象的所有实例。您的用例是什么?需要使用哪些引用?要使ObjectB实例被垃圾收集,最多应该保留一个列表;有一些弱ref集合类,但不幸的是不在JSE中。我想知道随时使用array.length/ArrayList.length等的ClassB实例的数量。我还想能够迭代该数组中引用的对象,对每个对象都做些什么。如果我有一个第三类ObjectC,它也可以创建objectB对象,我只想遍历ObjectC创建的对象,而不是objectA,那么最好保留一个单独的数组,或者循环检查所有B的条件,然后修改它们?我想我会在创建它们的每个类中保存对类B对象的引用,然后只保存对类B中那些数组/集合的引用。这样,每个对象只需要一个直接引用,同时仍然可以轻松地获取所有现有的B对象。只有在类第一次请求新的类B对象时,才会在类B中进行附加引用,每个后续的on只引用一次,因此应该