2016-04-09 1 views
2

В .NET существует класс под названием ConditionalWeakTable. Это карта/словарь, который дает некоторые гарантии относительно срока жизни объекта и права на сбор мусора.ConditionalWeakTable/слабый словарь в Java или Scala

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

Значения по-прежнему поддерживаются таблицей, но они удаляются, если ключ удален, потому что он недоступен.

Этот класс используется для прикрепления свойств к объектам во время выполнения без утечки памяти или вмешательства в сбор мусора.

Есть ли способ дублировать эту функциональность на Java или Scala?

ответ

4

Вы можете использовать в Java WeakHashMap<K,V>: реализация на основе

Хэш таблицы интерфейса Map, со слабыми ключами. Запись в WeakHashMap будет автоматически удалена, когда ее ключ больше не используется обычным способом. Точнее, наличие отображения для заданного ключа не будет препятствовать тому, чтобы ключ был отброшен сборщиком мусора, то есть был завершен, финализирован и , а затем возвращен. Когда ключ был отброшен, его запись фактически удалена с карты, поэтому этот класс ведет себя несколько иначе, чем от других реализаций карты.

Или, если вы используете Scala, используйте обертку представленную scala.collection.mutable.WeakHashMap[A,B]

+0

Спасибо! В важном отношении это различно: «... Поэтому необходимо следить за тем, чтобы объекты ценности не ссылались на их собственные ключи» - таблица .NET имеет дело с этой ситуацией автоматически, но я думаю, что это достаточно хорошо, если нет ничего другого. – GregRos

+0

Вы можете обернуть ваши значения в 'WeakReference', чтобы обойти это, как указано в другой части документов: * Если значения на карте не зависят от карты, содержащей сильные ссылки на них, один из способов решения это должно обернуть значения самими внутри WeakReferences перед вставкой. * –

+0

А, но это создает еще одну проблему: теперь значения могут умереть точно так же, как ключи, и я не хочу этого. Свойства не должны исчезать сами по себе. – GregRos

Смежные вопросы