【发布时间】:2014-12-01 16:57:10
【问题描述】:
在我看来,我发现了一种情况,标准的垃圾收集算法不能很好地使用。
假设我有一些对象A,它在构造时将自己添加为来自对象B 的事件的事件侦听器。由于对象具有将自身添加为侦听器所需的所有数据,因此它也具有将自身从侦听器中删除的数据。
很遗憾,GC 无法启动删除过程,因为对象将在侦听器列表中引用,直到明确删除。
因此,这意味着任何一个对象都不应该将自己添加为侦听器,或者应该有一种方法可以将某些引用标记为不重要。在后一种情况下,GC 会启动垃圾回收,即使存在对该对象的一些引用——如果它们只是“不重要”的情况。
显然,程序员应该有义务通过dispose或finalize等方法清除所有不重要的引用。
我知道这种直接实施将是一种安全漂白。例如,如果程序员违反了处置契约,垃圾回收会提供不正确的引用。
那么,问题是:是否有一些库或模式来实现这种关系?
【问题讨论】:
-
对于侦听器的特定情况,您应该在不再需要它们时将其删除。其他情况可能会使用弱引用或 finalize(),但对于通常不起作用的侦听器。
标签: java garbage-collection disposable