我有义务调用removeMouseListener()吗?

msa*_*ord 5 java listener mouselistener

如果我已添加MouseListener使用,Component#addMouseListener()我有义务将其删除removeMouseListener()吗?

我正在考虑特别是在内存泄漏方面,javax.swing.Timer如果stop()没有调用则会导致内存泄漏.

我在文档中找不到任何可以删除侦听器的内容,但我可能会认为这是作者可能会想到的.也许.

检查JDK源表明,如果鼠标侦听器本身没有引用会阻止它,则侦听器的存在不会阻止符合条件的组件进行GC.

我想,鉴于格言"它比对不起更安全",我真的在问是否有人能指出一些文档,表明删除鼠标监听器或任何监听器的更一般情况都不是必须的.

swo*_*ing 4

这取决于哪些其他对象持有对侦听器的引用,以及侦听器是否具有对组件的引用。我稍微研究了一下 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。