Tài liệujava.lang.ref
thư viện Java cho gói mô tả độ mạnh giảm dần của ba kiểu tham chiếu rõ ràng.
Bạn sử dụng một SoftReference
khi bạn muốn đối tượng được tham chiếu vẫn tồn tại cho đến khi tiến trình máy chủ sắp hết bộ nhớ. Đối tượng sẽ không đủ điều kiện để thu thập cho đến khi bộ sưu tập cần giải phóng bộ nhớ. Nói một cách lỏng lẻo, ràng buộc một SoftReference
phương tiện, "Ghim đối tượng cho đến khi bạn không thể nữa."
Ngược lại, hãy sử dụng một WeakReference
khi bạn không muốn ảnh hưởng đến thời gian tồn tại của đối tượng được tham chiếu; bạn chỉ muốn đưa ra một xác nhận riêng về đối tượng được tham chiếu, miễn là nó vẫn còn tồn tại. Tính đủ điều kiện thu thập của đối tượng không bị ảnh hưởng bởi sự hiện diện của các ràng buộc WeakReference
. Một cái gì đó giống như ánh xạ bên ngoài từ cá thể đối tượng đến thuộc tính liên quan, trong đó thuộc tính chỉ cần được ghi lại miễn là đối tượng liên quan còn sống, là một cách sử dụng tốt cho WeakReference
s và WeakHashMap
.
Cái cuối PhantomReference
cùng— — khó mô tả hơn. Giống như WeakReference
, một ràng buộc như vậy PhantomReference
không ảnh hưởng đến thời gian tồn tại của đối tượng được tham chiếu. Nhưng không giống như các loại tham chiếu khác, thậm chí không thể bỏ qua tham chiếu a PhantomReference
. Theo một nghĩa nào đó, nó không hướng đến thứ mà nó chỉ đến, theo như những gì người gọi có thể nói. Nó chỉ cho phép người ta liên kết một số dữ liệu liên quan với đối tượng được tham chiếu — dữ liệu sau này có thể được kiểm tra và xử lý khi đối tượng PhantomReference
được xếp hàng đợi trong liên quan của nó ReferenceQueue
. Thông thường người ta dẫn xuất một kiểu từ PhantomReference
và bao gồm một số dữ liệu bổ sung trong kiểu dẫn xuất đó. Thật không may, có một số dự báo giảm liên quan đến việc sử dụng loại có nguồn gốc như vậy.
Trong mã ví dụ của bạn, nó không phải là ref
tham chiếu (hoặc, nếu bạn thích, "biến") có thể là rỗng. Đúng hơn, đó là giá trị thu được bằng cách gọi Reference#get()
có thể là null. Nếu nó được tìm thấy là null, bạn đã quá muộn; đối tượng được tham chiếu đang trên đường được thu thập:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMap
nhưng khôngSoftHashMap
hoặcPhantomHashMap
xuất sắc, tại sao tôi không nhận thấy điều này trước đây .. ??