我有义务调用删除MouseListener()吗?

时间:2011-03-09 01:19:47

标签: java listener mouselistener

如果我使用MouseListener添加了Component#addMouseListener(),我必须使用removeMouseListener()删除它吗?

我特别想到javax.swing.Timer如果没有调用stop()会导致内存泄漏。

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

检查JDK源表明,如果鼠标侦听器本身没有引用会阻止它,那么侦听器的存在将不会阻止符合条件的组件被GC。

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

2 个答案:

答案 0 :(得分: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;
    }
}

然后垃圾收集器无法回收组件,直到你的Foo实例也被回收(或者可以回收),你可能应该显式调用removeMouseListener。

答案 1 :(得分:1)

除非您不再需要这种行为,否则不要删除它们。

Java中的GC清理没有剩余引用的任何对象(例如,组件是GC,并且您没有在其他地方持有对MouseListener的引用)