Хотя SoftReference
может показаться удобным способом реализации кэширования памяти, требуется, чтобы среда выполнения Java сделала несколько произвольное определение того, превышает ли выгода от хранения объекта стоимость его хранения. К сожалению, среда выполнения имеет ограниченную информацию о реальной стоимости хранения объекта (учитывая, что реальная стоимость может включать влияние использования памяти приложением на другие приложения), и практически не имеет информации о преимуществах сохранения объекта вокруг него. .
Если будет целесообразно хранить объект вокруг себя, даже если внешние сильные ссылки на него не существуют, кэш должен сохранять сильную ссылку на него (по крайней мере, до тех пор, пока он кажется полезным). Если выгода от сохранения объекта в кэше будет расширяться только до тех пор, пока существует внешняя ссылка (например, потому что создание экземпляров дешево, но наличие двух логических объектов, содержащих одинаковые данные, использует один и тот же экземпляр для их хранения, облегчило бы сравнение между этими объектами ), следует использовать WeakReference
.
Между прочим, если бы у меня были мои барабанщики, .net поддерживал бы другой тип ссылки, которого я не видел ни на одной платформе: ссылку "интереса для кого-то другого", которая использовалась бы в сочетании с типом WeakReference
. Ссылка «представляющая интерес для кого-то другого» может быть использована в качестве строгой ссылки, но подходящая конфигурация WeakReference
будет признана недействительной, если единственные сильные ссылки на ее цель будут «представлять интерес для кого-то другого». Такая концепция может повысить эффективность при использовании одновременного GC в тех случаях, когда обработчик слабых событий будет многократно генерировать сильную ссылку на свою цель. Если на самом деле никто не интересуется, что делает обработчик событий со своей целью, было бы желательно, чтобы обработчик мог отписаться.