如何在Java中删除所有对象指针

11

在Java中,是否有一种优雅的方式可以将所有现有对象指针设置为null? 我想删除一个对象,但它在多个地方被注册为事件侦听器。


1
为什么不直接删除事件监听器呢? - emory
是的,一个可能的解决方案是在对象被删除时从所有EventListeners中删除所有引用, 但使用WeakReferences更加优雅,因为它们会在对象设置为null时自我销毁。 - Skip
5个回答

8

对于这件事情没有什么优雅的方法。不要试图这样做,否则你最终会得到难以维护的代码。


8
您可以查看引用。如果您使用引用来引用类,当所有常规引用被删除时,它并不会阻止对象被垃圾收集器回收。由Reference类持有的引用在收集器确定要收集哪些对象时不计数。当然,监听器必须正确处理引用突然消失的情况。您还需要确保有些东西保留了常规引用,以使类保持存在的时间足够长。

请参考这个线程,了解软引用和弱引用之间的区别。 Java中软引用和弱引用的区别是什么?


“Reference” 是所有引用类的通用超类型,我猜你是指 “WeakReferences”? - Michael Berry
这通常是情况,但有使用其他两种方法的原因。 - sblundy
完全同意,我只是指在这个问题的背景下,WeakReference似乎是最合适的选择! - Michael Berry

5
不是显式地这样做,没有。这有一个很好的原因 - 这不是Java中垃圾回收的工作方式!如果你真的想这样做(尽管我主要是为了学术目的而说这些话,我强烈建议不要这样做),我能想到的最好方法是可能将所有对对象的引用都包装在WeakReferences中,并传递它们,只保留一个对对象的强引用。如果将该强引用设置为null,则所有对该对象的弱引用都变得可以进行垃圾回收。
当然,您需要知道,一旦将硬引用设置为null,WeakReferences就可能随时随机消失。因此,您需要确保使用它们的所有代码都准备好处理它们。
话虽如此,这条路几乎不是最好的选择,并且会使您的代码更加难以维护!确保它们在适当的范围内被释放将是远远更好的选择,如果您的其余代码足够整洁,那么这应该不难。

2

几点说明:

  1. 在Java中,您无法控制对象的删除。这是垃圾回收器的工作。您可以指示GC进行垃圾回收,但这并不保证对象实际上会被删除。

  2. 实际上,当对象无法再被访问时,它才会被删除。如果您删除了对它的所有引用,那么就无法再访问它了。


这就是为什么我要求删除所有对象引用的方法。 - Skip
你不能这样做 - 这基本上是我的答案。你可以创建一个包装类,在需要时检索对象的引用,但你必须确保使用这个包装器的代码不会在内部存储引用。 - Peter Knego

1

使用Java,您无法使用引用来执行该操作。但是您可以创建一个确定性的Dispose方法,像.NET的IDisposable一样清空引用中的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接