1

我有一些自定义对象,例如:

public class House
{
    private Roof r;
    private Wall w;
    private Floor f;

    public House()
    {
        this.r = new Roof();
        this.w = new Wall();
        this.f = new Floor();
    }
}

然后我创建一个新的House对象实例:

public static void main()
{
    House h = new House();
}

所以,现在我有四个对象:

  • 房子 h
  • 屋顶
  • 楼层 f

屋顶r、墙壁w和地板f完全取决于房子。

因此,如果我要删除 House h,我希望它们也被删除。

正确的方法是什么?


如果我将此方法添加到House类怎么办:

public void remove()
{
    this.r = null;
    this.w = null;
    this.f = null;
}

当我需要移除h所有组件的房子时,请写:

public static void main()
{
    h.remove();
    h = null;
}

我认为这应该有效,但不确定。

另外,也许有更好的方法?

是的,没有关于公共房屋,旅馆等的东西。:)

4

3 回答 3

1

你永远不能依赖垃圾收集的发生。即使你打电话System.gc(),你也不能保证它会做任何事情。当系统决定运行垃圾收集时,可能会收集无法访问的引用,但如果您运行一个小型应用程序,收集器可能永远不会运行。

如果需要在处理对象时收到通知,则应使用 ajava.lang.ref.PhantomReference和 a java.lang.ref.ReferenceQueue。不要依赖Object.finalize()。但这似乎不是您的问题;你只是想自己清理一下。只有当您的应用程序的性能需要它时,您才应该关心它。

于 2013-03-18T03:03:10.987 回答
0

您不需要清空所有实例变量,House因为当没有对House.

如果从其他地方引用它们怎么办?但我希望通过删除“父”对象来删除它们。

为此,每次从类外的某个地方引用对象时,都应该使用弱引用House。这样,当不再有对 的引用时,对象将被垃圾收集House,因为指向它们的唯一强引用在House.

于 2013-03-18T08:28:57.263 回答
-1

您给出的解决方案几乎是正确的。将对象引用标记为 null 后,只要该垃圾收集器开始运行,该对象就会被 JVM 垃圾收集器销毁并从内存中删除。

您也可以在将引用变量设置为 NULL 后手动指示垃圾收集器收集垃圾。

于 2013-03-18T02:59:48.297 回答