Почему существует WeakHashMap, но отсутствует WeakSet?
с J. Bloch
A ... источником утечек памяти является слушатели ... Лучший способ убедиться, что обратных мусора оперативно стоит хранить только слабые ссылки на них, например, хранить их только в качестве ключей в WeakHashMap.
Итак, почему в Java нет слабого набора основа коллекции?
4 ответа:
все просто: есть варианты использования
WeakHashMap
(в частности, в случае, когда вы хотите аннотировать объекты с дополнительными свойствами), но нет никаких вариантов использования для слабых наборов.
Set<Object> weakHashSet = Collections.newSetFromMap( new WeakHashMap<Object, Boolean>());
как видно
Collections.newSetFromMap
документации, передаетWeakHashMap
иSet
.
Итак, почему в Java collection framework нет слабого набора?
единственный действительно правильный ответ на это заключается в том, что мы не можем сказать вам, почему, потому что мы не люди, которые принимали проектные решения. Только дизайнеры Java знаете, почему они приняли такое решение1.
в то время как могут быть ограничены случаи использования для
WeakHashSet
, частью философии проектирования библиотеки классов Java было избежать заполнения класса библиотеки с классами утилит для всех возможных вариантов использования.Существует ряд других библиотек классов, которые включают типы коллекций; Apache Commons Collections и Google Collections (aka Guava) являются хорошими примерами. Однако,
WeakHashSet
даже не "сделал разрез" для библиотек Apache и Google.и, конечно, вы можете использовать
Collections.newSetFromMap
обернутьWeakHashMap
экземпляра.
1 - Обсуждение правильности этого решения выходит за рамки для сайте StackOverflow. Это сайт вопросов и ответов, а не дискуссионный форум.
в то время как вы действительно можете использовать
Collections.newSetFromMap()
чтобы получить слабый набор, его варианты использования на самом деле довольно ограничены.Если вы хотите реализовать что-то вроде
String.intern()
возможно, вы захотите взглянуть на GuavaInterners.newWeakInterner()
функциональность.