2012-03-24 15 views
29

में लीक कर रहा है आईडीई की "कन्स्ट्रक्टर में इसे लीक करने" के बारे में शिकायत क्यों है? मैंने हमेशा यह माना है कि यह सिर्फ खराब अभ्यास है। लेकिन मुझे वास्तव में कभी नहीं मिला कि यह बुरा क्यों है।जावा इसे कन्स्ट्रक्टर

+0

http://stackoverflow.com/questions/3921616/java-leaking-this-in-constructor –

+0

FWIW पर एक नज़र डालें, वास्तव में एक सैद्धांतिक JVM सुरक्षा छेद है यदि 'यह' कन्स्ट्रक्टर में बहुत जल्दी लीक हो गया है । लेकिन जेवीएम (माना जाता है) आश्वस्त करता है कि आप इसे जल्दी से रिसाव नहीं कर सकते हैं। –

उत्तर

56

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

+2

क्या कोई इस पोस्ट में "सर्वश्रेष्ठ अभ्यास" टैग बना और संलग्न कर सकता है, कृपया? – user1050755

+2

एकल-थ्रेडेड प्रोग्राम में 'इस' को लीक करने के साथ किसी समस्या का उदाहरण क्या होगा? – WaelJ

7

जीवन में कुछ पूर्णताएं हैं, उदाहरण के लिए। आपको करों का भुगतान करना होगा ... या ... मौत अपरिहार्य है। लेकिन "एक निर्माता के बाहर this गुजरना हमेशा खराब होता है" उनमें से एक नहीं है।

पीटर द्वारा इंगित चेतावनी सभी उपयुक्त और मान्य हैं। यह किसी भी विधि या संदर्भ में this को किसी भी विधि या संदर्भ में रिसाव करने के लिए निश्चित रूप से समस्याग्रस्त होगा जिसमें संदर्भ अज्ञात या अविश्वसनीय ग्राहकों को प्रकाशित हो जाएगा। किसी भी क्लाइंट कोड, भरोसेमंद या नहीं, के लिए अभी तक पूरी तरह से निर्मित ऑब्जेक्ट के संदर्भ को प्रकाशित करना अभी भी बुरा है, यह धारणा के साथ संचालित होता है कि यह वैध और सुसंगत वस्तु के लिए दृश्य होगा।

जिसके अनुसार, वहाँ बिल्कुल एक पैकेज-निजी विधि उस पर कहते हैं, वस्तुओं एक आम इंटरफेस है, इसलिए का एक समूह एक आम प्रारंभ करता है, के लिए एक निर्माता से this गुजर के साथ कुछ भी गलत नहीं है, खासकर यदि कि प्रारंभ लंबा है या जटिल।

टीएल; डीआर: निश्चित रूप से कुछ स्थितियां हैं जिनमें मेरी राय में, यह केवल एक निर्माता से this पास करने के लिए स्वीकार्य नहीं है, बल्कि वास्तव में ऐसा करने के लिए वांछनीय है।

+6

बस इसे मत करो। हमने कुछ साल पहले बनाई गई बग के आसपास काम करने वाले दिनों को बर्बाद कर दिया था जब किसी ने 'विश्वसनीय' 'पैकेज' निजी 'विधि के लिए एक कन्स्ट्रक्टर से' यह 'पारित किया था। समय के साथ, यह विधि बढ़ती जा रही है, और अन-प्रारंभिक उदाहरण एक घटना कतार में आया। निर्माण के बाद बस एक अंतिम init() का उपयोग करें, और एक अज्ञात नायक बनें। – Charlweed

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