क्या ऐसी स्थिति है जहां सरल रचना के बजाय कमजोर संदर्भों का उपयोग करना बेहतर होगा?


10

हालाँकि, जावा डॉक्स निर्दिष्ट करता है, कि कमजोर संदर्भ मुख्य रूप से कैनोपिकलाइजिंग मैपिंग के लिए हैं, आपको इंटरनेट पर कई , कई , कई लोग मिल जाएंगे , जो बताते हैं कि WeakHashMap अपने जीवनकाल के दौरान ऑब्जेक्ट मेटाडेटा को संग्रहीत करने के लिए एकदम सही है। हालाँकि, कोई भी एक उदाहरण और उपयुक्त उदाहरण देने के लिए परेशान नहीं करता है ।

ऑब्जेक्ट को जोड़ने के लिए WeakHashMap का उपयोग करना या मेटाडेटा को स्टोर करना मुझे लगता है, जैसे कि लानत चीज का उपयोग करने की इच्छा पर आधारित एक मनमाना निर्णय। दूसरे शब्दों में - एक बुरा डिजाइन । मैं समझता हूँ, कि ऐसी परिस्थितियाँ हैं जहाँ विरासत उपलब्ध नहीं हो सकती है (अंतिम वर्ग, इंटरफेस), लेकिन रचना के बारे में क्या? मैं एक उदाहरण के बारे में नहीं सोच सकता जहाँ रचना एक विकल्प नहीं होगा। और निश्चित रूप से एक बेहतर है, क्योंकि यह एक "भाषा क्विक" के बजाय एक अच्छी तरह से स्थापित सिद्धांत पर निर्भर करता है।

तो, क्या ऐसी स्थिति है, जहां सरल रचना के बजाय कमजोर संदर्भों का उपयोग करना बेहतर होगा? यदि नहीं, तो इंटरनेट पर सभी को यह गलत क्यों लगता है?


तर्क त्रुटि: "... केवल लानत चीज का उपयोग करने की इच्छा पर आधारित मनमाना निर्णय। दूसरे शब्दों में - एक बुरा डिजाइन।" सिरों का मतलब औचित्य नहीं हो सकता है, लेकिन साधन सिरों को अलग करने के लिए पर्याप्त नहीं हैं। समान विधियों को देखते हुए परिणाम काल्पनिक रूप से एक अच्छा डिजाइन हो सकता है। हालांकि इस मामले के लिए मैं इस पर बहस नहीं करूंगा। :)
cwharris

3
कमजोर संदर्भ रचना और विरासत के लिए एक orthogonal अवधारणा है।
रॉबर्ट हार्वे

जवाबों:


13

मान लीजिए कि मुझे कुछ डेटा ऑब्जेक्ट्स के साथ मेटाडेटा को संबद्ध करने की आवश्यकता है। यह एक बहुत ही सामान्य परिदृश्य है। मैं डेटा ऑब्जेक्ट्स को नियंत्रित नहीं करता हूं, और उनमें से बहुत सारे हैं, और प्रश्न में एपीआई (कॉलबैक, वर्चुअल तरीके, आदि ..) मुझे उन डेटा ऑब्जेक्ट्स की पेशकश करता है, लेकिन मेरे मेटाडेटा के बिना। इसलिए, मुझे उन डेटा ऑब्जेक्ट्स में से प्रत्येक के लिए कुछ स्थिति को ट्रैक करने की आवश्यकता है, अर्थात् जिन्हें मैंने पहले देखा है और फिर से देख सकता है। मैं इस मेटाडेटा को एक अलंकरण कहूंगा, जो उस अवधारणा के लिए कभी-कभी उपयोग किया जाने वाला शब्द है।

सरल रचना विज्ञापन वस्तु (मेटाडेटा के साथ एक) से दूसरे ऑब्जेक्ट (डेटा के साथ एक) को आसानी से देखने के लिए प्रदान करती है, इस अनुमान के साथ कि चूंकि मैं मेटाडेटा ऑब्जेक्ट डिज़ाइन को नियंत्रित करता हूं, इसलिए मैं डेटा ऑब्जेक्ट पर सीधे एक संदर्भ डाल सकता हूं ।

हालाँकि, जब तक आप डेटा ऑब्जेक्ट के डिज़ाइन को नियंत्रित नहीं करते हैं और इसे बदल सकते हैं, सरल रचना रिवर्स लुकअप (डेटा ऑब्जेक्ट से कुछ मेटाडेटा तक) प्रदान नहीं करती है। वास्तव में, जब तक आपके पास मेटाडेटा ऑब्जेक्ट का संग्रह नहीं होता है, तब तक आप किसी ऑब्जेक्ट (डेटा) आइटम से संबंधित मेटाडेटा आइटम का पता नहीं लगा सकते हैं।

वस्तु से जाने वाली दिशा में लुकअप की समस्या के अलावा इसके एडिटिंग मेटाडेटा को खोजने के लिए, मेटाडेटा जीवनकाल की समस्या भी है।

मेटाडेटा जो जमा होता है और कभी जारी नहीं किया जाता है जब डेटा ऑब्जेक्ट का उपयोग नहीं किया जाता है, तो यह मेमोरी लीक है।

एक कमजोर संदर्भ हैशमाप दोनों समस्याओं को हल करता है। यह डेटा दिए गए मेटाडेटा का पता लगाने की अनुमति देता है, और डेटा के मुक्त होने के कुछ समय बाद मेटाडेटा को मुक्त करने की अनुमति देता है।

आगे ध्यान दें कि एक कमजोर संदर्भित हैशमैप न केवल (मेटाडेटा) मानों को पुनः प्राप्त करने के लिए अनुमति देता है (gc'ed), लेकिन यह भी (डेटा) कुंजियों को पुनः प्राप्त किया जाना चाहिए (gc'ed), क्योंकि अगर कुंजी रखी गई थी, जो भी होगी। स्मृति रिसाव, और आगे, मूल्यों को कभी भी जारी नहीं किया जा सकता है।


संरचना के रूप में कमजोर-हैशमैप समर्थित मेटाडेटा तालिका गणना के साथ डेटा ऑब्जेक्ट का उपयोग क्यों नहीं करता है?
जैक

2
@ जैक, रचना, विशेष रूप से मेरे दिमाग में कम से कम "सरल रचना", वस्तुएं अन्य वस्तुओं का जिक्र है, लेकिन सीधे तौर पर। रचना का "है-ए" एक साधारण संदर्भ, या कभी-कभी एक संग्रह का उपयोग करके व्यक्त किया जाता है। यहाँ हैशमैप एक अप्रत्यक्ष तरीका है। यदि आपके पास हैशमैप नहीं है तो आप श्रंगार तक नहीं पहुँच सकते। जबकि रचना में आप इस नेविगेशन को कर सकते हैं। इस प्रकार, मैं इस मेटाडेटा को रचना के बजाय एक अलंकरण कहना पसंद करता हूं, लेकिन वे निश्चित रूप से संबंधित हैं। एफडब्ल्यूआईडब्ल्यू, श्रंगार करता है (आईएमएचओ) डेटा के साथ रचना करता है, बस आसपास का दूसरा तरीका नहीं है।
एरिक Eidt

@ जैक, फिर से: मेरा आखिरी एफडब्ल्यूआईडब्ल्यू, मुझे बस एहसास हुआ कि कमजोर हैशमैप का उपयोग करते समय आप सामान्य रूप से मेटाडेटा विज्ञापन वस्तु से दूसरे को मेमोरी होल्ड करने के कारण (या यदि आप चाहते हैं कि हैड-इन है कि एक संदर्भ नहीं डालेंगे) दिशा, यह एक कमजोर संदर्भ होगा)। तो, आम तौर पर कमजोर हैशमप क्लाइंट दो ऐसे पहलुओं के साथ काम करता है जो प्रभावी रूप से एक दूसरे से जोड़े जाते हैं, लेकिन तकनीकी रूप से एक दूसरे के साथ वस्तु संरचना में नहीं होते हैं।
एरिक Eidt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.