HashSet<WeakReference<T>>
Set
еквивалент ли е на WeakHashMap<T>
? Тоест, записите ще бъдат ли автоматично изтрити, когато вече няма препратки към тях?
Ако не, какъв е еквивалентът?
HashSet<WeakReference<T>>
Set
еквивалент ли е на WeakHashMap<T>
? Тоест, записите ще бъдат ли автоматично изтрити, когато вече няма препратки към тях?
Ако не, какъв е еквивалентът?
Не, ако даден обект, посочен от един от WeakReference
s в набора, бъде събран, WeakReference
пак ще бъде включен в набора и няма да бъде премахнат автоматично, но техният referent
ще бъде null
. WeakHashMap
използва допълнителен код за премахване на слабо реферираните ключове от картата, когато се събират боклуци.
Набор еквивалент на WeakHashMap
е:
Set<T> set = Collections.newSetFromMap(new WeakHashMap<T, Boolean>());
Като HashSet
също използва HashMap
вътрешно.
BTW: WeakReference
е просто обект, сочещ към обект, който може да бъде събран боклук въпреки препратката, поддържана от WeakReference
. Самият WeakReference
няма да бъде събиран за боклук, докато не бъде вече строго споменат никъде, както всички други обекти.
Ако необходимостта от такава функционалност е само за този единствен клас, моят съвет е да изберете второто решение, което споменахте, като използвате отговора на Nsh.
В противен случай, ако този проблем възникне на няколко места във вашия проект, ето решение, което измислих:
Това ще направи кода ви по-четлив и ще скриете грозните детайли зад тези декоратори, които се обясняват сами по себе си.
Забележка: Можем също така да елиминираме декоратора
@sub_init
, но мисля, че това е единственият законен начин за маркиране на метода като подинициализация. В противен случай вариант би бил да се съгласите да поставите префикс преди името на метода, да речем_init
, но мисля, че това е лоша идея.Ето имплементациите:
- person Barry Fruitman   schedule 15.10.2013