2012-06-25 13 views
8

क्या जावा के स्ट्रिंग मेमोरी पूल का कार्यान्वयन फ्लाईवेट पैटर्न का पालन करता है?जावा की स्ट्रिंग इंटरफ़ेस एक फ्लाईवेट है?

मुझे यह संदेह क्यों है, मैं देखता हूं कि आंतरिक में कोई बाहरी राज्य शामिल नहीं है। गोफ में मैंने पढ़ा है कि आंतरिक और बाह्य राज्य के बीच सही संतुलन होना चाहिए। लेकिन इंटर्न में सब कुछ आंतरिक है।

या हम कहेंगे कि गुणों के संबंध में कोई सख्त नियम नहीं है और केवल स्मृति को कम करने के लिए वस्तुओं को साझा करना पर्याप्त रूप से इसे उड़ाने के लिए पर्याप्त है।

कृपया मुझे समझने में मदद करें।

उत्तर

2

इंटर्निंग के बावजूद, जावा स्ट्रिंगको substring और इसी तरह की विधि कॉल के माध्यम से प्राप्त किए गए स्ट्रिंग के बीच char[] साझा करके फ्लाईवेट पैटर्न का उपयोग करता है। इसमें फ्लिपसाइड है, हालांकि: यदि आप एक विशाल स्ट्रिंग का एक छोटा सबस्ट्रिंग लेते हैं, तो विशाल char[] कचरा संग्रह के लिए योग्य नहीं होगा।

नोट: OpenJDK संस्करण 1.7.0_06 के रूप में ऊपर अप्रचलित हो गया है: तो char[] नहीं रह गया है उदाहरणों के बीच साझा किया जाता है कि कोड बदल गया था। substring() एक नई सरणी बनाता है।

+0

फ्लाईवेट ऑब्जेक्ट में अंतर्निहित स्थिति धारण करना और बाह्य राज्य जानकारी उत्तीर्ण करना - क्या हमें इसके बारे में चिंता करने की ज़रूरत है? क्योंकि गोफ बुक में, मैं आंतरिक/बाह्य के अलगाव के प्रति अधिक महत्व संलग्न करता हूं। यहां चार [] फ्लाईवेट में, आंतरिक और बाह्य क्या है? –

+0

यह आसान है - 'char []' पूरी तरह से आंतरिक है, और ऑब्जेक्ट स्ट्रिंग पूरी तरह से बाह्य है। एक स्ट्रिंग का उपयोग करके आप यह भी नहीं जानते कि 'char []' मौजूद है। –

+0

हॉटस्पॉट कार्यान्वयन अंततः ऑफसेट और लम्बाई फ़ील्ड के बिना सटीक लंबाई 'char []' (या संभवतः 'बाइट []') का उपयोग करने के लिए बदल रहा है। वास्तव में 'char [] 'को एक अलग आवंटन के रूप में भी समाप्त किया जाना चाहिए। –

4

हां String.intern() कार्यान्वयन फ्लाईवेट पैटर्न का पालन करता है।

javadoc रूप

स्ट्रिंग वस्तु के लिए एक विहित प्रतिनिधित्व रिटर्न कहते हैं। तारों का एक पूल, प्रारंभ में खाली, वर्ग स्ट्रिंग द्वारा निजी रूप से बनाए रखा जाता है।

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

यह इस प्रकार है कि किसी भी दो तारों और टी के लिए, s.intern() == t.intern() सत्य है अगर केवल और यदि s.equals (टी) सत्य है।

सभी शाब्दिक तार और स्ट्रिंग-मूल्यवान निरंतर अभिव्यक्ति प्रशिक्षित हैं। स्ट्रिंग शाब्दिक जावा भाषा विशिष्टता की §3.10.5 में परिभाषित कर रहे हैं

भाँति तार "पेर्म जनरल" अंतरिक्ष में और स्ट्रिंग वस्तुओं .intern() द्वारा दिया आप ऑपरेटर का उपयोग कर सकते == क्योंकि .intern() रिटर्न हमेशा पर रहते हैं बराबर मूल्यों के लिए एक ही वस्तु।

फिर याद रखें कि .intern() विधि लीक का उत्पादन नहीं करती है, क्योंकि आज जेवीएम पूल को कचरा करने में सक्षम है।

यह article भी पढ़ने की कोशिश करें।

+0

लेकिन फ्लाईवेट ऑब्जेक्ट आंतरिक को साझा करने के बारे में है। आंतरिक सिर्फ पूरी वस्तुओं को पकड़ रहा है। मुझे यहाँ फिट नहीं दिख रहा है। –

+0

मेरा सवाल है, "अकेले मेमोरी को बचाने के लिए साझा करना साझा करना इसे उड़ाने के लिए योग्य बनाता है?" बाह्य/आंतरिक राज्यों जैसे कार्यान्वयन विवरण के बावजूद .. –

+0

शायद जो मैंने पढ़ा वह गलत है, लेकिन विकिपीडिया पर भी नमूना रिटर्न और पूरे ऑब्जेक्ट को कैश करता है ([फ्लाईवेट पैटर्न] (http://en.wikipedia.org/wiki/Flyweight_pattern))। शायद कोई और पैटर्न को स्पष्ट कर सकता है। – dash1e

-1

फ्लाईवेट ऑब्जेक्ट immmutables आंतरिक साझा करने के बारे में है। आंतरिक सिर्फ पूरी वस्तुओं को पकड़ रहा है।

+0

चूंकि तार अपरिवर्तनीय हैं, इसलिए मुझे आपकी बात नहीं मिलती – Mishax

0

आपने सही ढंग से पहचाना है कि दोनों आंतरिक और फ्लाईवेट एक ही विचार पर आधारित हैं: सामान्य राज्य को कैशिंग और साझा करना। एक फ्लाईवेट के साथ, चरम मामले में जहां स्टोर करने के लिए कोई आंतरिक स्थिति नहीं है, वस्तु के अस्तित्व की कोई आवश्यकता नहीं है। बाहरी राज्य के लिए केवल सूचक ही रहता है, और फिर फ्लाईवेट आंतरिक बन गया है।

चाहे आंतरिक "वास्तव में" है या फ्लाईवेट का प्रकार नहीं है, केवल परिभाषाओं पर बहस है। सबसे महत्वपूर्ण बात यह है कि किसी को एक दूसरे के विशेष उदाहरण के रूप में कैसे देखा जा सकता है, तो आप अच्छे हैं।

0

जैसा कि दूसरों ने कहा है, String.intern() कैशिंग के बारे में सब कुछ है। यह पूल में पहले से संग्रहीत स्ट्रिंग अक्षर का संदर्भ देता है। इस तरह यह किसी भी तरह फ्लाईवेट पैटर्न के समान होता है क्योंकि यह मौजूदा वस्तुओं का उपयोग करता है जिसके परिणामस्वरूप कम मेमोरी खपत होती है और प्रदर्शन में वृद्धि होती है (हालांकि इंटर्न के स्ट्रिंग पूल में लुकअप के अपने प्रदर्शन ओवरहेड्स भी होते हैं)। इसलिए वे दोनों समान दिख सकते हैं लेकिन वे वास्तव में नहीं हैं।

संबंधित मुद्दे