图 2. 侦听器示例
只要从中添加侦听器的对象会及时删除,您就无需删除 JFace/SWT 侦听器。关键是理解从中添加侦听器的对象的生命周期。不管什么时候要向某个对象中添加侦听器,您都需要自问一下,侦听器被添加到哪个对象,侦听器的生命期有多长。
举例而言,假设应用程序创建了一个视图。该视图包含一个按钮。在您构建该视图时,您为按钮添加了一个选择侦听器,以便应用程序能够对按钮单击作出响应。您无需为删除按钮的侦听器而对视图添加一个删除侦听器,您也无需为按钮被撤销时删除按钮的侦听器而对按钮再添加一个删除侦听器。 SWT 会在按钮被撤销时执行对按钮侦听器的删除。您不必写这些冗余的代码和管理多余的工作。
在 RCP 应用程序中,经常会有某人创建一个视图并将其自身添加为 workbench 页侦听器。 Workbench 页往往很长寿,直到该应用程序关闭,workbench 页才会被关闭(从而清空侦听器)。在此情况下,您不应该依赖 workbench 页清空侦听器关联。您应当在视图被关闭时把该视图作为侦听器删除。