Я обязан вызвать removeMouseListener ()? - PullRequest
5 голосов
/ 09 марта 2011

Если я добавил MouseListener с помощью Component#addMouseListener(), должен ли я удалить его с помощью removeMouseListener()?

Я думаю, в частности, об утечках памяти, которые javax.swing.Timer можетпотому что если stop() не вызывается.

Я не могу найти в документации ничего, что могло бы сказать, что слушатели должны быть удалены, но я, возможно, думаю, что это то, что может предположить автор.Возможно.

Проверка источника JDK позволяет предположить, что при отсутствии ссылок в самих слушателях мыши, которые могли бы это предотвратить, присутствие слушателя не помешает GC'd приемлемого компонента.

Полагаю, учитывая принцип «это лучше, чем потом сожалеть», я действительно спрашиваю, может ли кто-нибудь указать мне какую-то документацию, которая указывает, что не обязательно удалять либо слушателей мыши, либо более общий случай любого слушателя.

Ответы [ 2 ]

4 голосов
/ 09 марта 2011

Это зависит от того, какие другие объекты содержат ссылки на слушателя и есть ли у слушателя ссылка на компонент.Я немного изучил код 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 голос
/ 09 марта 2011

Вы не удалите их, если вы больше не хотите такое поведение.

GC в Java очищает любые объекты без оставшихся ссылок (например, Компонент GC'd, и вы не держите ссылку на MouseListener где-то еще)

...