Слушатели Java должны быть удалены? (В общем) - PullRequest
28 голосов
/ 01 октября 2008

Представьте себе этот пример класса Java:

class A {
    void addListener(Listener obj);
    void removeListener(Listener obj);
}

class B {
    private A a;
    B() {
        a = new A();
        a.addListener(new Listener() {
            void listen() {}
        }
 }

Нужно ли добавить метод B для завершения для вызова a.removeListener? Предположим, что экземпляр A будет использоваться совместно с некоторыми другими объектами и переживет экземпляр B.

Я беспокоюсь, что могу создать здесь проблему с сборщиком мусора. Какова лучшая практика?

Ответы [ 12 ]

0 голосов
/ 01 октября 2008

A действительно предотвратит сборку мусора в B, когда вы используете стандартные ссылки для хранения ваших слушателей. В качестве альтернативы, когда вы поддерживаете списки слушателей вместо определения новый ArrayList (); Вы могли бы сделать что-то вроде новый ArrayList > ();

Оборачивая свой объект в слабую ссылку, вы можете удержать его от продления жизни объекта.

Конечно, это работает, только если вы пишете класс, который содержит слушателей

0 голосов
/ 01 октября 2008

Когда B является сборщиком мусора, он должен позволять также собирать мусор A и, следовательно, любые ссылки в A. Вам не нужно явно удалять ссылки в A.

Я не знаю каких-либо данных о том, может ли то, что вы предлагаете, повысить эффективность работы сборщика мусора и когда это стоит того, но мне было бы интересно увидеть его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...