web-dev-qa-db-ja.com

WeakHashMapが存在するのに、WeakSetがないのはなぜですか?

From J。ブロッホ

...メモリリークの原因はリスナーです...コールバックが迅速にガベージコレクションされるようにする最善の方法は、たとえば、 WeakHashMap

だから、Java Collections framework )にWeakSetがないのはなぜですか?

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

Collections.newSetFromMap ドキュメント、 WeakHashMap を渡して Set を取得します。

184
mart

だから、なぜJavaコレクションフレームワークにWeakSetがないのですか?

それに対する唯一の本当に正しい答えは、私たちが設計上の決定を下した人ではないので、私たちはなぜあなたが言うことができないということです。 Javaデザイナーなぜ彼らが決定したのかを知っている1


WeakHashSetの使用例は限られている場合がありますが、Javaクラスライブラリの設計哲学の一部は、考えられるすべての使用例でユーティリティライブラリをクラスライブラリに追加しないことです。

コレクション型を含む他の多くのクラスライブラリがあります。 Apache Commons CollectionsとGoogle Collections(別名Guava)は良い例です。ただし、WeakHashSetは、ApacheおよびGoogleライブラリを「カット」していません。

そして、もちろん、Collections.newSetFromMapWeakHashMapインスタンスをラップします。


1-その決定の正しさを議論することは、StackOverflowの範囲外です。これはQ&Aサイトであり、ディスカッションフォーラムではありません。

15
Stephen C

実際に Collections.newSetFromMap() を使用してWeakSetを取得できますが、実際の使用例は非常に限られています。

String.intern()のようなものを実装したい場合は、代わりにGuavaの Interners.newWeakInterner() 機能をご覧ください。

1
Axel Dörfler