Моего вопроса: Как я могу связать кучу значений с кучей ключейКак связать значения ключей без блокировки GC
- без изменения ключей непосредственно, и
- без предотвращая ключи от получения GC'd (зная, что значения имеют сильные ссылки на ключи)
фона:
Мне нужно связать кучу сложных объектов (вызывать их значения) несколькими частями (называть их ключами).
Как правило, так, как я делаю это, следует использовать хэш-карту, которая связывает ключи и значения.
Это прекрасно работает. Тем не менее, мне также необходимо убедиться, что сопоставления не мешают сбору мусора ключей. Другими словами, наличие сопоставления не должно препятствовать тому, чтобы ключ собирал мусор.
Обычно способ решения этой проблемы - использовать WeakHashMap, который содержит только ключи WeakReferences. Однако WeakHashMaps будет работать, только если значения на карте не имеют сильных ссылок на клавиши. К сожалению, мои ценности имеют сильные ссылки на мои ключи, что предотвращает сбор ключей от мусора. Это можно обойти, используя слабые ссылки на значения, но это не жизнеспособное решение, потому что я не могу допустить, чтобы мои значения были GC'd перед моими ключами. Пока ключевой объект все еще существует, значения также должны существовать.
Итак, мое типичное решение этой ситуации - прекратить использование HashMap и вместо этого изменить ключ, чтобы иметь сильные ссылки на все необходимые ему значения. Это гарантирует, что я все еще могу получить все значения для данного ключа, но не предотвратит получение ключа GC'd, когда будет выполнен естественный жизненный цикл.
К сожалению, я не могу изменить ключи, поэтому я не могу добавить значения непосредственно к клавишам. Итак, какие другие умные решения существуют?
на «удалить значение -> ключ отображения», вы имеете в виду удалить сильные ссылки, которые имеют значения на ключах? К сожалению, я не могу изменить значения (вернее, я не могу помешать пользователю вставлять значения, которые будут иметь сильные ссылки на ключи, и очень вероятно, что они это сделают) – emmby
Да, это то, что я имею в виду , Если вы не используете шаблон типа singleton/enum/flyweight для ключей, я все же думаю, что вы должны иметь возможность использовать по-разному, но логически равные ключи в 'WeakHashMap' для решения этой проблемы. –
Что бы сохранить эти ключи на карте? Разве они не получат GC'd в произвольное время? – emmby