如果我使用MouseListener
添加了Component#addMouseListener()
,我必须使用removeMouseListener()
删除它吗?
我特别想到javax.swing.Timer
如果没有调用stop()
会导致内存泄漏。
我在文档中找不到任何可以删除侦听器的内容,但我可能认为这是作者可能会假设的内容。也许
检查JDK源表明,如果鼠标侦听器本身没有引用会阻止它,那么侦听器的存在将不会阻止符合条件的组件被GC。
我想,鉴于格言“它比对不起更安全”,我真的在问是否有人可以指出一些文档,表明删除鼠标监听器或任何更一般的情况都不是必须的。监听器。
答案 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的引用)