Một trường hợp hữu ích khác cho WeakHashMap
và WeakReference
là một thực hiện đăng ký người nghe .
Khi bạn tạo một cái gì đó muốn nghe một số sự kiện nhất định, thông thường bạn đăng ký một người nghe, ví dụ
manager.registerListener(myListenerImpl);
Nếu manager
lưu trữ trình nghe của bạn với a WeakReference
, điều đó có nghĩa là bạn không cần phải xóa thanh ghi, ví dụ như manager.removeListener(myListenerImpl)
bởi vì nó sẽ tự động bị xóa sau khi trình nghe hoặc thành phần của bạn giữ trình nghe không khả dụng.
Tất nhiên bạn vẫn có thể xóa trình nghe của mình theo cách thủ công, nhưng nếu bạn không hoặc bạn quên nó, nó sẽ không gây rò rỉ bộ nhớ và nó sẽ không ngăn người nghe của bạn bị thu gom rác.
Trường hợp nào WeakHashMap
đi vào hình ảnh?
Sổ đăng ký người nghe muốn lưu trữ những người nghe đã đăng ký vì WeakReference
họ cần một bộ sưu tập để lưu trữ các tài liệu tham khảo này. Không có WeakHashSet
triển khai trong thư viện Java tiêu chuẩn, WeakHashMap
nhưng chúng ta có thể dễ dàng sử dụng cái sau để "thực hiện" chức năng của cái đầu tiên:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Với điều này listenerSet
để đăng ký một trình nghe mới, bạn chỉ cần thêm nó vào tập hợp và ngay cả khi nó không bị xóa rõ ràng, nếu trình nghe không còn được tham chiếu nữa, nó sẽ bị JVM xóa tự động.