msa*_*ord 5 java listener mouselistener
如果我已添加MouseListener使用,Component#addMouseListener()我有义务将其删除removeMouseListener()吗?
我正在考虑特别是在内存泄漏方面,javax.swing.Timer如果stop()没有调用则会导致内存泄漏.
我在文档中找不到任何可以删除侦听器的内容,但我可能会认为这是作者可能会想到的.也许.
检查JDK源表明,如果鼠标侦听器本身没有引用会阻止它,则侦听器的存在不会阻止符合条件的组件进行GC.
我想,鉴于格言"它比对不起更安全",我真的在问是否有人能指出一些文档,表明删除鼠标监听器或任何监听器的更一般情况都不是必须的.
这取决于哪些其他对象持有对侦听器的引用,以及侦听器是否具有对组件的引用。我稍微研究了一下 Swing 代码,据我所知,侦听器注册对其侦听器持有强引用。
如果您在调用 addMouseListener 时创建了一个新的侦听器,那么addMouseListener(new MouseListener()...)您无需显式取消注册该侦听器就应该没问题。当垃圾收集器检查组件时,该侦听器在组件外部不可强访问,因此不会阻止垃圾收集器回收该组件。
但是,如果你有这样的事情:
public class Foo implements MouseListener {
...
private Component c;
public void registerWithComponent(final Component c) {
c.addMouseListener(this);
this.c = c;
}
}
Run Code Online (Sandbox Code Playgroud)
那么该组件无法被垃圾收集器回收,直到您的 Foo 实例也被回收(或可以被回收),并且您可能应该显式调用removeMouseListener。