पैकेज के लिएjava.lang.ref जावा लाइब्रेरी प्रलेखन तीन स्पष्ट संदर्भ प्रकारों की घटती ताकत की विशेषता है।
SoftReferenceजब आप संदर्भित ऑब्जेक्ट को जीवित रहने के लिए चाहते हैं, तब तक आप इसका उपयोग करते हैं, जब तक कि होस्ट प्रक्रिया स्मृति पर कम चल रही हो। जब तक कलेक्टर को मेमोरी को खाली करने की आवश्यकता नहीं होती तब तक वस्तु संग्रह के योग्य नहीं होगी । ढीले ढंग से कहा गया है, एक SoftReferenceसाधन बांधने , "जब तक आप अब और नहीं कर सकते तब तक वस्तु को पिन करें।"
इसके विपरीत, WeakReferenceजब आप संदर्भित ऑब्जेक्ट के जीवनकाल को प्रभावित नहीं करना चाहते हैं , तब उपयोग करें ; आप केवल संदर्भित ऑब्जेक्ट के बारे में एक अलग दावा करना चाहते हैं , इसलिए जब तक यह जीवित रहता है। संग्रह के लिए ऑब्जेक्ट की पात्रता बाध्य WeakReferenceएस की उपस्थिति से प्रभावित नहीं होती है । वस्तु उदाहरण से संबंधित संपत्ति के लिए बाहरी मानचित्रण की तरह कुछ, जहां संपत्ति को केवल तब तक दर्ज करने की आवश्यकता होती है जब तक संबंधित वस्तु जीवित है, WeakReferenceएस और के लिए एक अच्छा उपयोग है WeakHashMap।
पिछले एक PhantomReference- मुश्किल चरित्र के लिए। जैसे WeakReference, इस तरह की बाध्यता PhantomReferenceसंदर्भित वस्तु के जीवनकाल पर कोई प्रभाव नहीं डालती है। लेकिन अन्य संदर्भ प्रकारों के विपरीत, कोई भी किसी को भी नहीं दे सकता है PhantomReference। एक मायने में, यह उस चीज़ की ओर इशारा नहीं करता है जो इसे इंगित करता है, जहां तक कॉलर बता सकते हैं। यह केवल संदर्भित वस्तु के साथ कुछ संबंधित डेटा को संबद्ध करने की अनुमति देता है- डेटा जिसे बाद में निरीक्षण किया जा सकता है और उस पर कार्रवाई की जा सकती है जब PhantomReferenceइसके संबंधित में कतारबद्ध हो ReferenceQueue। आम तौर पर एक से एक प्रकार प्राप्त होता है PhantomReferenceऔर उस व्युत्पन्न प्रकार में कुछ अतिरिक्त डेटा शामिल होते हैं। दुर्भाग्य से, इस तरह के व्युत्पन्न प्रकार का उपयोग करने के लिए कुछ डाउनकास्टिंग शामिल है।
आपके उदाहरण कोड में, यह refसंदर्भ नहीं है (या, यदि आप पसंद करते हैं, तो "चर") जो शून्य हो सकता है। बल्कि, यह कॉलिंग द्वारा प्राप्त मूल्य है Reference#get()जो शून्य हो सकता है। यदि यह अशक्त पाया जाता है, तो आपको बहुत देर हो चुकी है; संदर्भित वस्तु पहले से ही एकत्रित होने के रास्ते पर है:
final String val = ref.get();
if (null != val)
{
}
else
{
}
WeakHashMapलेकिन कोईSoftHashMapया नहींPhantomHashMapउत्कृष्ट सवाल है, मैंने पहले इस पर ध्यान क्यों नहीं दिया .. ??