不使用匿名类添加动作侦听器会导致内存泄漏吗?

时间:2016-08-26 03:35:08

标签: java memory-leaks

这不会导致内存泄漏,因为现在你无法在收集传感器时删除动作监听器吗?

this.btnClickMe.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.append("Hello\n");
            }
        });

这样做会不会更好呢?

this.clickMeButtonActionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.append("Hello\n");
            }
        };

 this.btnClickMe.addActionListener(this.clickMeButtonActionListener);

...

@Override
public void dispose() {

    this.btnClickMe.removeActionListener(
               this.clickMeButtonActionListener);

    super.dispose();
}

2 个答案:

答案 0 :(得分:2)

没有

您不需要实施处置,通常也不应该。

当btnClickMe被丢弃时,您的匿名侦听器将像其他所有内容一样被垃圾收集,并且不再需要对它进行任何引用,而您无需执行任何操作。

如果监听器是临时的,那么确定,存储它然后在使用removeActionListener逻辑完成它时将其删除。但是没有处置,你甚至不知道何时或是否会被召唤。当您的应用程序不再需要附加监听器时,请执行此操作。

答案 1 :(得分:0)

你的问题是一个很好的例子,"半知识"实际上是一件危险的事情。

您似乎明白Java是垃圾收集的;但另一方面 - 你错过了解它是如何运作的。

因此,简而言之:对象活着,只要它们在查看堆时可以到达。一个匿名的听众只有在其所有者"活着。因此:当你的框架/面板......不再存在时,所有拥有的听众都会死亡。用它也是。因此他们有资格进行垃圾收集。