Java: шаблон наблюдателя и сборщик мусора
Я реализовал TableModel, регистры которого запускают PropertyChangeEvents. Моя TableModel прослушивает эти события для запуска TableModelEvents, чтобы обновить базовый JTable.
Если TableModel очищается или обновляется с помощью новых регистров... имеет ли TableModel вызывать метод "removePropertyChangeListener" в каждом регистре, чтобы позволить GC собирать эти регистры?
Предположим, что нет другой живой ссылки на эти регистры.
1 ответ
Нет. У объекта регистрации есть ссылка на вашу табличную модель (через слушателя). Так что, если регистр больше недоступен, он будет собирать мусор.
С другой стороны, если вы сохраняете регистры живыми, но изменяете модель таблицы, не удаляя ее в качестве слушателя из регистров, то регистры сохранят ссылку на старую модель, и модель не будет собирать мусор.
Обычно это хорошая идея, чтобы долгоживущие объекты слушали изменения в недолговечных объектах. Если это другой способ, то забывание удалить слушателей приводит к проблемам с памятью (если только слабые ссылки не используются для ведения списка слушателей)