听众作为弱引用的利弊
将侦听器保留为弱引用有哪些利弊?
当然,最大的“优点”是:
将侦听器添加为弱引用意味着侦听器不需要费心“删除”自身。
对于那些担心监听器对对象的唯一引用的人来说,为什么不能有2种方法,addListener()和addWeakRefListener()?
那些不关心删除的人可以使用后者。
将侦听器保留为弱引用有哪些利弊?
当然,最大的“优点”是:
将侦听器添加为弱引用意味着侦听器不需要费心“删除”自身。
对于那些担心监听器对对象的唯一引用的人来说,为什么不能有2种方法,addListener()和addWeakRefListener()?
那些不关心删除的人可以使用后者。
首先,在侦听器列表中使用弱引用会给你的对象不同的语义,然后使用硬引用。在硬引用案例中,addListener(...) 表示“通知提供的对象有关特定事件,直到我使用 removeListener(..)显式停止它”,在弱引用案例中,它表示“通知提供的对象有关特定事件,直到此对象不会被其他任何人使用(或显式停止 removeListener)”。请注意,在许多情况下,有对象,侦听某些事件,并且没有其他引用将其从GC中阻止是完全合法的。记录器可以举个例子。
正如你所看到的,使用 WeakReference 不仅能解决一个问题(“我应该记住,不要忘记在某个地方删除添加的监听器”),而且还会提出另一个问题 - “我应该记住,我的听众可以在任何时候停止收听,当不再引用它时”。你没有解决问题,你只是用一个问题换取另一个问题。看,以任何方式,你都强迫明确定义,设计和追踪你的听众的寿命 - 以这种或那种方式。
因此,就个人而言,我同意在听众列表中使用WeakReference更像是一种黑客而不是解决方案。这是值得了解的模式,有时它可以帮助你 - 例如,使遗留代码运行良好。但这不是选择模式:)
附言:另外应该注意的是,WeakReference引入了额外的间接寻址级别,在某些情况下,事件率极高,可能会降低性能。
这不是一个完整的答案,但你引用的优势也可能是它的主要弱点。考虑一下如果操作侦听器的实现较弱会发生什么情况:
button.addActionListener(new ActionListener() {
// blah
});
该操作侦听器将随时收集垃圾!对匿名类的唯一引用是要向其添加匿名类的事件,这种情况并不少见。