Почему существует WeakHashMap, но отсутствует WeakSet? - PullRequest
71 голосов
/ 31 октября 2010

С J.Bloch

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

Итак, почему в инфраструктуре Java Collections ?

нет никакого WeakSet

Ответы [ 4 ]

184 голосов
/ 31 октября 2010
Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

Как видно из Collections.newSetFromMap документации, передавая WeakHashMap, чтобы получить Set.

15 голосов
/ 31 октября 2010

Итак, почему в фреймворке java нет WeakSet?

Единственный действительно правильный ответ на этот вопрос заключается в том, что мы не можем сказать вам почему, потому что мы не являемсялюди, которые принимали дизайнерские решения.Только разработчики Java знают, почему они приняли решение 1 .


Хотя могут быть ограниченные варианты использования для WeakHashSet, части JavaФилософия проектирования библиотек классов заключалась в том, чтобы избежать заполнения библиотек классов служебными классами для всех возможных вариантов использования.

Существует ряд других библиотек классов, которые включают типы коллекций;Коллекции Apache Commons и Google Collections (также известные как Guava) являются хорошими примерами.Тем не менее, WeakHashSet даже не «сделал разрез» для библиотек Apache и Google.

И, конечно, вы можете использовать Collections.newSetFromMap, чтобы обернуть экземпляр WeakHashMap.


1 - Обсуждение правильности этого решения выходит за рамки StackOverflow.Это сайт вопросов и ответов, а не дискуссионный форум.

1 голос
/ 02 марта 2018

Хотя вы действительно можете использовать Collections.newSetFromMap() для получения WeakSet, его варианты использования на самом деле весьма ограничены.

Если вы хотите реализовать что-то вроде String.intern(), вы можете захотетьВзгляните на функциональность Guava Interners.newWeakInterner().

0 голосов
/ 31 октября 2010

Все просто: есть варианты использования для WeakHashMap (в частности, случай, когда вы хотите аннотировать объекты с дополнительными свойствами), но для WeakSets нет вариантов использования.

...