2010-10-31 20 views
63

Od J. BlochDlaczego istnieje WeakHashMap, ale brakuje WeakSet?

w ... źródłem wycieków pamięci jest słuchacze ... Najlepszym sposobem, aby upewnić się, że callbacks śmieci są zbierane natychmiast jest przechowywanie tylko słabe odniesień do nich, na przykład , przez przechowując je tylko jako klucze w WeakHashMap.

Dlaczego więc nie ma WeakSet w Java Collections framework?

+1

Staś, czy możesz przyjąć odrzuconą, poprawną odpowiedź Mart, zamiast odrzuconej, błędnej odpowiedzi Martina? – toolforger

Odpowiedz

-55

To proste: istnieją przypadki użycia dla WeakHashMap (w szczególności w przypadku, gdy chcesz opisywanie obiektów z dodatkowymi właściwościami), ale nie istnieją żadne przypadki użycia dla WeakSets.

+6

@Martin v. Löwis: Implementacja Observer jest przypadkiem użycia dla WeakSets, czyż nie? –

+0

To dyskusyjne i decyzja dotycząca projektu interfejsu API. java.util.Observable zdecydowało się na silne odniesienie do obserwatorów. Jest to wybór obserwatora, który przekazuje (zawijanie do) słabe odniesienie, pozwalając obserwowalnym utrzymać jedyne odniesienie do obserwatora - co nie byłoby możliwe, gdyby domyślnie były słabo przywoływane. –

+0

@Martin v. Löwis: Hm .. Rozumiem. To dyskusyjne. Ale są też pewne implementacje, w których wzorzec obserwatorów używa WeakSets. A J Bloch o tym wie. jeśli tak, dlaczego nie ma dla tego żadnej specjalnej klasy? Ale widzę ... Prawdopodobnie to użycie nie jest często takie podobne. –

163
Set<Object> weakHashSet = Collections.newSetFromMap(
     new WeakHashMap<Object, Boolean>()); 

od javadoc w java.util.Collections#newSetFromMap(Map)

+4

właściwie każdy zestaw w kolekcji java zawiera mapę do przechowywania. – mart

+2

Tak, ale dlaczego nie ma konkretnej klasy dla takich rzeczy? –

+9

Łatwo sobie wyobrazić, dlaczego opiekunowie java.util mogliby chcieć przestać dostarczać podwójne wersje map i zestawów wszystkiego, co robią, i zdecydowali się po prostu dostarczyć newSetFromMap() zamiast ... czyż nie? –

14

Dlaczego więc nie ma WeakSet w ramach zbioru java?

Chociaż nie może być ograniczone do przypadków użycia WeakHashSet, część klasy biblioteki Java filozofii projektowania było uniknąć wypełniania bibliotek klasy z klas użytkowych dla wszystkich możliwych przypadków użycia.

Istnieje szereg innych bibliotek klas, które zawierają typy zbiórki; Kolekcje Apache Commons i Kolekcje Google (aka Guava) są dobrymi przykładami. Jednak WeakHashSet nie "wyciął" nawet dla bibliotek Apache i Google.

Oczywiście można również użyć instancji Collections.newSetFromMap do owinięcia instancji WeakHashMap.

+0

Dzięki. Prawdopodobnie potrzebuję więcej obserwacji pracy nad innymi bibliotekami, aby zrozumieć strukturę zbierania java. –

0

Chociaż można rzeczywiście korzystać Collections.newSetFromMap() dostać WeakSet, to przypadki użycia są całkiem ograniczone.

Jeśli chcesz zaimplementować coś takiego jak String.intern(), możesz zamiast tego rzucić okiem na funkcjonalność Guava Interners.newWeakInterner().

Powiązane problemy