関連: Javaには「LinkedConcurrentHashMap」データ構造がありますか?
イベント リスナーへの参照を保持するコレクション クラスを探しています。
理想的には、コレクションに次のプロパティを持たせたいと思います (優先度順):
- 挿入順序を維持します。以前のリスナーはイベントをキャンセルし、後で追加されたリスナーに配信されないようにする場合があります。
HashSet
イテレータが間違った順序で要素を返すようなクラスを使用すると、これは壊れます。 - s を使用
WeakReference
して、リスナー リストがリスナーのガベージ コレクションを妨げないようにします。 - コレクションは である
Set
ため、重複は自動的に削除されます。 - これ
Iterator
はコレクションのスレッドセーフなスナップショットであり、新しいリスナーの追加による影響を受けません。イベントを複数のスレッドに配信することもできます。(これは必須ではありません。代わりに、セットのクローンを反復処理できます。)
これらの基準のすべてではなく一部を満たすいくつかのクラスを認識しています。例:
java.util.LinkedHashSet
(#1 と #3)java.util.WeakHashMap
、Collections.newSetFromMap
(#2 と #3)でラップjavax.swing.event.EventListenerList
(追加の同期が必要です) (#1 と #4)java.util.concurrent.CopyOnWriteArraySet
(#1、#3、#4)
しかし、#1と#2の両方には何もありません。このようなクラスはどこかのライブラリに存在しますか?