只要从中添加侦听器的对象会及时删除,您就无需删除 JFace/SWT 侦听器。关键是理解从中添加侦听器的对象的生命周期。不管什么时候要向某个对象中添加侦听器,您都需要自问一下,侦听器被添加到哪个对象,侦听器的生命期有多长。
举例而言,假设应用程序创建了一个视图。该视图包含一个按钮。在您构建该视图时,您为按钮添加了一个选择侦听器,以便应用程序能够对按钮单击作出响应。您无需为删除按钮的侦听器而对视图添加一个删除侦听器,您也无需为按钮被撤销时删除按钮的侦听器而对按钮再添加一个删除侦听器。 SWT 会在按钮被撤销时执行对按钮侦听器的删除。您不必写这些冗余的代码和管理多余的工作。
在 RCP 应用程序中,经常会有某人创建一个视图并将其自身添加为 workbench 页侦听器。 Workbench 页往往很长寿,直到该应用程序关闭,workbench 页才会被关闭(从而清空侦听器)。在此情况下,您不应该依赖 workbench 页清空侦听器关联。您应当在视图被关闭时把该视图作为侦听器删除。
我曾在一个聊天程序中看到过另一个受惑于对象生命周期的例子。每当打开一个聊天窗口,都会向伙伴列表添加一个侦听器。聊天窗口永远不删除侦听器,只要伙伴列表没有被撤销,不会有什么问题。最终结果是越来越多的侦听器被添加到伙伴列表,而且它们永远不会被删除。需要强调的是这不仅是内存泄漏,也是对性能的破坏。侦听器泄漏的后果是,每个聊天窗口以及它所有可访问的对象都驻留在内存。同时,每次当伙伴列表向列表内的侦听器发信号,都会浪费时间去通知那些本来已经被关闭的聊天窗口。