Плюсы и минусы слушателей как слабые ссылки - PullRequest
70 голосов
/ 14 июня 2011

Каковы плюсы и минусы сохранения слушателей в качестве WeakReferences.

Большое «Pro», конечно, заключается в том, что:

Добавление слушателя в качестве WeakReference означает, что слушателю не нужно беспокоиться«удаление» само по себе.

Обновление

Для тех, кто беспокоится о том, что у слушателя есть единственная ссылка на объект, почему не может быть 2 метода, addListener () и addWeakRefListener()?

те, кто не заботится об удалении, могут использовать последнее.

Ответы [ 12 ]

0 голосов
/ 22 октября 2013

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

0 голосов
/ 22 мая 2013

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

Как указывалось ранее, это действительно другая семантика, по сравнению с обычным случаем addListener / removeListener, но она допустима в некоторых сценариях.

Например, рассмотрим очень большое дерево, котороеразреженный - некоторые уровни узлов не определены явно, но могут быть выведены из родительских узлов далее вверх по иерархии.Неявно определенные узлы прослушивают те родительские узлы, которые определены, поэтому они обновляют свое подразумеваемое / унаследованное значение.Но дерево огромно - мы не хотим, чтобы подразумеваемые узлы были вокруг навсегда - до тех пор, пока они используются вызывающим кодом, плюс, возможно, кэш LRU в несколько секунд, чтобы избежать повторного использования одних и тех же значений снова и снова.

Здесь слабый слушатель позволяет дочерним узлам прослушивать родителей, а также определять время их жизни на основе достижимости / кэширования, поэтому структура не поддерживает все подразумеваемые узлы в памяти.

...