Почему существует WeakHashMap, но отсутствует WeakSet?


с J. Bloch

A ... источником утечек памяти является слушатели ... Лучший способ убедиться, что обратных мусора оперативно стоит хранить только слабые ссылки на них, например, хранить их только в качестве ключей в WeakHashMap.

Итак, почему в Java нет слабого набора основа коллекции?

4 63

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() возможно, вы захотите взглянуть на Guava Interners.newWeakInterner() функциональность.