liên quan: Does java have a "LinkedConcurrentHashMap" data structure?lớp thu Thích hợp cho người nghe sự kiện trong Java
Tôi đang tìm kiếm một lớp bộ sưu tập để giữ tham chiếu đến người nghe sự kiện.
Lý tưởng nhất là tôi muốn bộ sưu tập để có các thuộc tính sau (theo thứ tự ưu tiên):
- Duy trì trật tự chèn. Những người nghe trước đó có thể hủy bỏ sự kiện, ngăn không cho nó được gửi đến người nghe được thêm vào sau. Điều này sẽ phá vỡ nếu sử dụng một lớp như
HashSet
có trình vòng lặp có thể trả về các phần tử theo thứ tự sai. - Sử dụng
WeakReference
s để danh sách người nghe không ngăn người nghe bị thu thập rác. - Bộ sưu tập là
Set
, vì vậy các bản sao sẽ tự động bị xóa. Iterator
là ảnh chụp nhanh an toàn theo chủ đề của bộ sưu tập, không bị ảnh hưởng bởi việc thêm người nghe mới. Cũng cho phép các sự kiện được phân phối trên nhiều luồng. (Điều này không cần thiết - tôi có thể lặp qua một bản sao của tập hợp thay thế.)
Tôi biết một số lớp đáp ứng một số tiêu chí này. Ví dụ:
java.util.LinkedHashSet
(# 1 và # 3)java.util.WeakHashMap
, bọc bởiCollections.newSetFromMap
(# 2 và # 3)javax.swing.event.EventListenerList
(cần thêm một số đồng bộ) (# 1 và # 4)java.util.concurrent.CopyOnWriteArraySet
(# 1, # 3 và # 4)
Nhưng không có gì với cả # 1 và # 2. Lớp học như thế này tồn tại trong một thư viện ở đâu đó?
Có thực sự điển hình cho đối tượng nghe để thực hiện 'bằng’ không? –
Ngoài ra, công việc của họ là giữ lại sự tham chiếu mạnh mẽ đối với mỗi người nghe? Nếu tôi đã viết một người nghe để đăng nhập các sự kiện khác nhau, và đăng ký nó, tôi chắc chắn sẽ ngạc nhiên khi nó đột nhiên biến mất một vài phút sau đó! –
Không có vấn đề với bằng là: '{Object o = new Object(); WeakReference r1 = new WeakReference (o), r2 = new WeakReference (o); trả về r1.equals (r2);} 'trả về' false' – finnw