Как удалить все указатели объектов в java

Есть ли элегантный способ в Java установить все существующие объектные указатели на нуль? Я хочу, чтобы объект был удален, но он зарегистрирован в нескольких местах прослушивателя событий.

Ответ 1

Вы можете посмотреть Ссылки. Если вы используете ссылку для обращения к классу, это не будет препятствовать сбору мусора, когда все обычные ссылки удаляются. Ссылки, хранящиеся в классе Reference, не учитываются, когда коллекционер определяет, какие объекты собирать. Разумеется, слушателям придется правильно обращаться с этой ссылкой, внезапно исчезая. И вам нужно будет убедиться, что что-то содержит регулярную ссылку, пока вам нужно класс, чтобы придерживаться.

Просмотрите эту тему для обсуждения различий между мягкими и слабыми ссылками. В чем разница между мягкой ссылкой и слабой ссылкой в ​​Java?

Ответ 2

Для этого нет элегантного способа. Не пытайтесь это сделать, иначе вам будет сложно поддерживать код.

Ответ 3

Не ясно, нет. И есть веская причина для этого - это просто не то, как сбор мусора работает на Java!

Если вы действительно хотите это сделать (хотя я говорю это в основном в академических целях, я бы настоятельно советовал не делать этого), лучший подход, о котором я могу думать, потенциально завершает все ссылки на объект в WeakReferences, и передайте их, просто держась за одну сильную ссылку на ваш объект. Если вы установили эту сильную ссылку на null, то все слабые ссылки на этот объект станут пригодными для сбора мусора.

Конечно, вам нужно знать, что, как только жесткая ссылка будет установлена ​​в значение null, WeakReferences могут случайно исчезнуть в любое время после этого. Поэтому вам нужно убедиться, что все ваши коды, использующие их, готовы к этому.

Тем не менее, этот маршрут почти не самый лучший, чтобы пойти вниз, и сделает ваш код намного сложнее поддерживать! Обеспечение того, чтобы все они были выпущены по мере того, как они выходили из сферы видимости, было бы, безусловно, лучшей альтернативой, и не должно быть сложно, если остальная часть вашего кода будет достаточно аккуратной.

Ответ 4

Несколько примечаний:

  • Вы не можете управлять удалением объектов в Java. Это работа сборщика мусора. Вы можете поручить GC делать сборку мусора, но это не гарантирует, что объект фактически будет удален.

  • С практической точки зрения объект удаляется, когда он больше не может быть достигнут. Если вы удалите все ссылки на него, вы больше не сможете этого достичь.

Ответ 5

С Java вы не можете делать это со ссылками. Вы можете создать детерминированный метод Dispose, который опустошает значения в ссылке, например .NET IDisposable.