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

时间:2012-06-07 20:45:18

标签: java instance-variables class-variables

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

private ObjectB createObjectB() {
    Object b = new ObjectB();
    return b;
 }

我想跟踪ObjectB的所有实例。有什么更好的方法呢?

  • 要将所有对象跟踪为ArrayList内部ObjectA
  • OR ObjectB内的一些类变量。

每种方法的优缺点是什么?如果我知道只有ObjectA中的这一个方法才能创建ObjectB个对象,它会有所不同吗?

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

6 个答案:

答案 0 :(得分:1)

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

如果你跟踪它们,请记住,当你在集合中有对象时,GC无法释放内存,这可能导致内存不足错误

答案 1 :(得分:0)

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

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

我很想知道你为什么要这样做。除其他外,您可能会遇到线程问题,具体取决于您的应用及其架构。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这取决于你需要达到的目标。 ObjectB(这是一个坏名字,顺便说一句)的实例能够相互交谈吗?如果是这样,那么您需要在类中创建一个全局变量(即static字段),或者您必须将列表保留在ObjectA中并将其“注入”ObjectB的每个实例中。 1}} - 这意味着你需要在两个地方保留一个引用。

如果ObjectB的实例不需要彼此交谈,通常就足以将列表保留在ObjectA中。

但大多数情况下,没有必要保留一份清单。它甚至可能是危险的,因为你必须确保列表不会增长,直到消耗掉所有内存。

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

要小心你所写的东西的成本 - 很容易让这些便宜的东西累积成一种非常昂贵的依赖性扼杀你的东西。

答案 4 :(得分:0)

对我来说,它看起来像对象A和对象C是管理对象B实例的类。

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

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

在两个经理类中我都有一个HashMap

你可以有一个方法来停止/开始/创建/去除/删除A类或C类中的B对象,这些对象采用'name'ob对象B并在对象B上启动相应的操作。

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

答案 5 :(得分:0)

基于你对ObjectC所说的内容,我想说ObjectA(和C)维护一个ObjectB数组是最有意义的。 (实际上,如果您希望添加和减去B,我建议使用某种Collection而不是数组。)

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

如果你发现自己处于需要创建B总数的位置而你不能使用A.countB()+ C.countB(),那么你有两个选择:B中的静态地图key是创建者对象(A,C或其他),值是B的集合。

我会因为几个原因而劝阻这一点,主要是因为创建的对象会挂起(因此没有GC和潜在的内存问题)。

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