Một trường hợp hữu ích khác cho WeakHashMapvà WeakReferencelà 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 managerlư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ì WeakReferencehọ 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ó WeakHashSettriển khai trong thư viện Java tiêu chuẩn, WeakHashMapnhư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.