【问题标题】:Am I obliged to call removeMouseListener()?我必须调用 removeMouseListener() 吗?
【发布时间】:2011-03-09 01:19:47
【问题描述】:

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

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

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

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

我想,鉴于格言“它比抱歉更安全”,我真的在问是否有人可以向我指出一些文件,表明不需要删除鼠标侦听器或更一般的情况听众。

【问题讨论】:

    标签: java listener mouselistener


    【解决方案1】:

    这取决于其他对象持有对侦听器的引用,以及侦听器是否具有对组件的引用。我对 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。

    【讨论】:

    • 这证实了我从 JDK 源代码中看到的内容。我想我正在寻找比这更强大的保证,但似乎我能找到的任何文档中都不存在这样的保证。
    【解决方案2】:

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

    Java 中的 GC 会清除所有没有剩余引用的对象(例如,组件已被 GC 处理,并且您没有在其他地方持有对 MouseListener 的引用)

    【讨论】:

    • 当然可以,但是我如何确定 JDK/swing 不包含组件之外的其他引用?
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多