"फिर से हैलो!"

"अब मैं आपको एक और अद्भुत चीज़ के बारे में बताने जा रहा हूँ: WeakReference ।"

"यह लगभग सॉफ्ट रेफरेंस जैसा ही दिखता है:"

उदाहरण
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"एक कमजोर संदर्भ की एक और विशेष विशेषता है।"

"यदि किसी वस्तु में साधारण संदर्भ या नरम संदर्भ नहीं हैं, लेकिन केवल कमजोर संदर्भ हैं, तो वस्तु जीवित है, लेकिन यह अगले कचरा संग्रह में नष्ट हो जाएगी।"

"क्या आप फिर से कह सकते हैं? इन संदर्भों में क्या अंतर है?"

"केवल सॉफ्ट रेफरेंस द्वारा मृत्यु से रखी गई वस्तु जितनी चाहें उतनी कचरा संग्रह जीवित रह सकती है और अपर्याप्त स्मृति होने पर शायद नष्ट हो जाएगी।"

"केवल एक कमजोर संदर्भ द्वारा मृत्यु से रखी गई वस्तु अगले कचरा संग्रह से नहीं बचेगी। लेकिन जब तक ऐसा नहीं होता है, तब तक आप कमजोर संदर्भ पर प्राप्त () विधि को कॉल करके वस्तु प्राप्त कर सकते हैं और फिर इसके तरीकों को कॉल कर सकते हैं या इसके साथ कुछ और कर सकते हैं। "

"क्या होगा यदि ऑब्जेक्ट को सॉफ़्ट रेफरेंस और वीक रेफरेंस दोनों द्वारा संदर्भित किया जाता है?"

"यह सरल है। यदि कम से कम एक नियमित संदर्भ किसी वस्तु की ओर इशारा करता है, तो उसे जीवित माना जाता है। वैसे, इस तरह के संदर्भ को स्ट्रॉन्ग रेफरेंस कहा जाता है।"

"यदि कोई नियमित संदर्भ किसी ऑब्जेक्ट को इंगित नहीं करता है, लेकिन सॉफ्ट रेफरेंस करता है, तो यह धीरे-धीरे पहुंच योग्य है।"

"यदि कोई नियमित संदर्भ या सॉफ़्ट संदर्भ किसी वस्तु को इंगित नहीं करता है, लेकिन एक कमजोर संदर्भ करता है, तो यह कमजोर रूप से पहुंच योग्य है।"

"इसके बारे में सोचें। एक सॉफ्ट रेफरेंस ऑब्जेक्ट को हटाए जाने से बचाता है और यह सुनिश्चित करता है कि अपर्याप्त मेमोरी होने पर ही ऑब्जेक्ट को डिलीट किया जाएगा। एक वीक रेफरेंस ऑब्जेक्ट को अगले कचरा संग्रह तक रखता है। एक सॉफ्ट रेफरेंस डिलीट करने के लिए अधिक प्रतिरोध प्रदान करता है।"

"आह। मुझे लगता है कि मैं समझता हूँ।"

"बहुत बढ़िया, फिर मैं आपको एक और दिलचस्प बात के बारे में बताता हूँ जिसमें WeakReferences शामिल है - WeakHashMap।"

"गंभीर लगता है!"

"और फिर कुछ! एक WeakHashMap एक हैश मैप है जिसकी कुंजी कमजोर संदर्भ (कमजोर संदर्भ) हैं।"

"अर्थात्, आप इस तरह के हैश मैप में ऑब्जेक्ट जोड़ते हैं और उनके साथ काम करते हैं। व्यापार हमेशा की तरह।"

"जब तक आप WeakHashMap में संग्रहीत वस्तुओं में कुंजियों के रूप में नियमित (मजबूत या नरम) संदर्भ होते हैं, तब तक ये वस्तुएं जीवित रहेंगी।"

"लेकिन मान लीजिए कि पूरे आवेदन में इन वस्तुओं के लिए कोई और संदर्भ नहीं है। जो कुछ भी उन्हें मरने से रोकता है, वह कमजोर हैश मैप के अंदर कुछ कमजोर संदर्भ हैं। अगले कचरा संग्रह के बाद, ऐसी वस्तुएं कमजोर हाश मैप से गायब हो जाएंगी। स्वयं से। जैसे कि वे वहाँ कभी नहीं थे।"

"मुझे यकीन नहीं है कि मैं समझ गया हूँ।"

"आप एक WeakHashMap: एक कुंजी और एक मान में वस्तुओं के जोड़े को संग्रहीत करते हैं। लेकिन WeakHashMap कुंजियों को सीधे संदर्भित नहीं करता है, बल्कि WeakReferences के माध्यम से होता है। इसलिए, जब कुंजी के रूप में उपयोग की जाने वाली वस्तुएं कमजोर रूप से पहुंच योग्य हो जाती हैं, तो वे अगले पर नष्ट हो जाती हैं। कचरा संग्रह। और परिणामस्वरूप, उनके मान भी स्वचालित रूप से WeakHashMap से हटा दिए जाते हैं।"

"कुछ वस्तुओं के बारे में अतिरिक्त जानकारी संग्रहीत करने के लिए WeakHashMap का उपयोग करना बहुत सुविधाजनक है।"

"सबसे पहले, यदि आप वस्तु को कुंजी के रूप में उपयोग करते हैं तो जानकारी तक पहुँचना बहुत आसान है।"

"दूसरा, अगर वस्तु नष्ट हो जाती है, तो यह हैश मैप से सभी संबंधित डेटा के साथ गायब हो जाती है।"

"उदाहरण के लिए:

उदाहरण
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo (…));

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "WeakHashMap के अंदर, कुंजियों को WeakReferences के रूप में संग्रहीत किया जाता है।"
  2. "जैसे ही उपयोगकर्ता ऑब्जेक्ट कचरा कलेक्टर द्वारा नष्ट कर दिया जाता है, निकालें (उपयोगकर्ता) विधि को WeakHashMap के अंदर निहित रूप से बुलाया जाता है और उपयोगकर्ता ऑब्जेक्ट से जुड़ी कोई भी जानकारी स्वचालित रूप से WeakHashMap से हटा दी जाती है।"

"यह एक शक्तिशाली उपकरण की तरह दिखता है। मैं इसका उपयोग कहाँ कर सकता हूँ?"

"यह परिस्थितियों पर निर्भर करता है। मान लीजिए कि आपके पास प्रोग्राम में एक धागा है जो कुछ कार्यों के काम को ट्रैक करता है, वस्तुओं द्वारा दर्शाया जाता है, और उनके बारे में एक लॉग में जानकारी लिखता है। यह धागा मॉनिटर किए गए ऑब्जेक्ट्स को एक WeakHashMap में स्टोर कर सकता है। जितनी जल्दी हो सके चूंकि वस्तुओं की आवश्यकता नहीं होती है, कचरा संग्राहक उन्हें हटा देता है, और उनके संदर्भ भी स्वचालित रूप से WeakHashMap से हटा दिए जाते हैं।"

"दिलचस्प लगता है। मुझे पहले से ही ऐसा लगता है कि मैंने अभी तक कोई गंभीर जावा प्रोग्राम नहीं लिखा है जो इस तरह के शक्तिशाली तंत्र का लाभ उठाता है। लेकिन मैं उस दिशा में काम करूंगा। बहुत बहुत धन्यवाद, ऐली, इस तरह के एक दिलचस्प पाठ के लिए।"