Есть два сценария, где это полезно для хэша-карта, чтобы быть слабой (ваш, кажется, соответствует второму):
Один хочет прикрепить информацию к объекту с известной идентичностью; если объект прекращает свое существование, прилагаемая информация станет бессмысленной и также должна прекратиться. JavaScript поддерживает этот сценарий.
Желательно объединить ссылки на семантически идентичные объекты в целях сокращения требований к хранению и ускорения сопоставлений. Замена многих ссылок на одинаковые большие поддеревья, например, со ссылками на одно и то же поддерево, может позволить уменьшить порядок использования памяти и время выполнения. К сожалению, JavaScript не поддерживает этот сценарий.
В обоих случаях ссылки в таблице будут храниться в живых до тех пор, пока они полезны, и «естественно» получают право на инкассо, когда они становятся бесполезными. К сожалению, вместо того, чтобы реализовывать отдельные классы для двух описанных выше способов, разработчики WeakReference
сделали это так, чтобы он мог быть полезен для использования, хотя и не очень хорошо.
В тех случаях, когда ключи определяют равенство в среднем ссылочном идентификаторе, WeakHashMap
удовлетворяет первому шаблону использования, но второй будет бессмысленным (код, содержащий ссылку на объект, который был семантически идентичен сохраненному ключу, ссылку на сохраненный ключ, и не понадобится WeakHashMap, чтобы дать ему). В тех случаях, когда ключи определяют некоторую другую форму равенства, обычно не имеет смысла, чтобы запрос таблицы возвращал что-либо, кроме ссылки на сохраненный объект, но единственный способ избежать сохранения сохраненной ссылки сохранить ключ в используйте команду WeakHashMap<TKey,WeakReference<TKey>>
и попросите клиента получить слабую ссылку, получить сохраненную в ней ссылку ключа и проверить, действительно ли она действительна (она может быть собрана между моментом, когда WeakHashMap
возвращает WeakReference
и время, которое проверяется WeakReference
).
Я думаю, что этот вопрос конкретно со ссылкой на JavaScript, а не Java или какой-либо другой язык, который имеет 'WeakReference' /' WeakHashMap'. Проблема в том, что JavaScript имеет только что-то вроде «WeakHashMap», но не эквивалент «WeakReference». –
@ Qantas94Heavy: Действительно так. Возможно, я должен был указать, что JavaScript поддерживает только первое, что, к сожалению, не та, которую я подозреваю, что действительно хочет OP. Вам нравится редактирование? – supercat