Чтобы создать WeakReference
, используйте синтаксис WeakReference<SomeType> myWeakReference = new WeakReference<SomeType>(actualObject);
. Чтобы получить объект через этот WeakReference
, выполните проверку if (weakWidget == null)
. Таким образом, вы избежите NullPointerException
, если он уже был собран мусором.
Эта статья на Java.net Этана Николаса объясняет , почему вы хотели бы использовать WeakReference
вместо сильного. В нем приведен пример класса final
(непостижимый) с именем Widget
, у которого нет определенного последовательного UID, при условии, что разработчик решит определить последовательный UID для отслеживания каждого экземпляра Widget
. Они делают это, создавая новый HashMap
и делая что-то вроде serialNumberMap.put(widget, widgetSerialNumber);
, что является сильной ссылкой. Это означает, что он должен быть явно очищен, когда он больше не нужен. Разработчик несет ответственность за то, чтобы точно знать, когда вручную «собирать мусор» этой ссылки и удалять ее из HashMap
, что следует делать только тогда, когда они действительно уверены, что она больше не нужна. Это может быть проблема, с которой вы столкнулись в вашем приложении.
В этом конкретном случае, как объясняется в статье, разработчик мог бы использовать класс WeakHashMap
вместо этого (как в своем примере @NayAneshGupte), где ключ на самом деле WeakReference
. Это позволило бы JVM аннулировать ключи к старым Widget
s так, как считает нужным, чтобы сборщик мусора мог прийти и уничтожить связанные с ними объекты.
В статье также говорится о SoftReferences
и PhantomReferences
(которые я никогда не использовал). Вы можете прочитать больше обо всем этом в этой статье javapapers.com и в этом блоге Rally .