gpt4 book ai didi

java - 我有义务调用 remove MouseListener() 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:29 24 4
gpt4 key购买 nike

如果我使用 Component#addMouseListener() 添加了一个 MouseListener,我是否必须使用 removeMouseListener() 将其删除?

我特别考虑如果未调用 stop()javax.swing.Timer 可能导致的那种内存泄漏。

我在文档中找不到任何说明应该删除监听器的内容,但我可能认为这可能是作者的假设。也许吧。

检查 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;
}
}

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

关于java - 我有义务调用 remove MouseListener() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com