В .NET существует класс под названием ConditionalWeakTable
. Это карта/словарь, который дает некоторые гарантии относительно срока жизни объекта и права на сбор мусора.ConditionalWeakTable/слабый словарь в Java или Scala
Он содержит слабые ссылки на ключи и автоматически удаляет ключи, если их невозможно достичь из любой точки за пределами таблицы (так что ключи не сохраняются, будучи членами таблицы, и они не сохраняются, если они могут быть достигнуты из любого другой аналогично недостижимый ключ или значение в таблице, даже если есть круговые ссылки и тому подобное).
Значения по-прежнему поддерживаются таблицей, но они удаляются, если ключ удален, потому что он недоступен.
Этот класс используется для прикрепления свойств к объектам во время выполнения без утечки памяти или вмешательства в сбор мусора.
Есть ли способ дублировать эту функциональность на Java или Scala?
Спасибо! В важном отношении это различно: «... Поэтому необходимо следить за тем, чтобы объекты ценности не ссылались на их собственные ключи» - таблица .NET имеет дело с этой ситуацией автоматически, но я думаю, что это достаточно хорошо, если нет ничего другого. – GregRos
Вы можете обернуть ваши значения в 'WeakReference', чтобы обойти это, как указано в другой части документов: * Если значения на карте не зависят от карты, содержащей сильные ссылки на них, один из способов решения это должно обернуть значения самими внутри WeakReferences перед вставкой. * –
А, но это создает еще одну проблему: теперь значения могут умереть точно так же, как ключи, и я не хочу этого. Свойства не должны исчезать сами по себе. – GregRos