में लीक कर रहा है आईडीई की "कन्स्ट्रक्टर में इसे लीक करने" के बारे में शिकायत क्यों है? मैंने हमेशा यह माना है कि यह सिर्फ खराब अभ्यास है। लेकिन मुझे वास्तव में कभी नहीं मिला कि यह बुरा क्यों है।जावा इसे कन्स्ट्रक्टर
उत्तर
कंस्ट्रक्टर (नियंत्रक नहीं) में संदर्भ खतरनाक है, खासकर एक बहुप्रचारित वातावरण में। ऐसा इसलिए है क्योंकि जब तक कन्स्ट्रक्टर कॉल समाप्त नहीं हो जाता तब तक ऑब्जेक्ट पूरी तरह से निर्मित नहीं होता है। कन्स्ट्रक्टर से this
लीक करने का अर्थ है कि बाहरी दुनिया को ऐसी वस्तु तक पहुंच प्राप्त होती है जो अभी तक पूरी तरह से निर्मित नहीं है। यह आवश्यक रूप से एक एकल थ्रेडेड प्रोग्राम में समस्याओं का कारण नहीं बन सकता है (हालांकि यह संभव है, लेकिन इस मामले में समस्या अधिक स्पष्ट है)। लेकिन अगर this
अन्य धागे के लिए लीक हो गया है, तो वे वास्तव में इसके निर्माण समाप्त होने से पहले ऑब्जेक्ट के साथ कुछ करने का प्रयास कर सकते हैं, जिससे सूक्ष्म और बग खोजने में कठिनाई होती है।
क्या कोई इस पोस्ट में "सर्वश्रेष्ठ अभ्यास" टैग बना और संलग्न कर सकता है, कृपया? – user1050755
एकल-थ्रेडेड प्रोग्राम में 'इस' को लीक करने के साथ किसी समस्या का उदाहरण क्या होगा? – WaelJ
जीवन में कुछ पूर्णताएं हैं, उदाहरण के लिए। आपको करों का भुगतान करना होगा ... या ... मौत अपरिहार्य है। लेकिन "एक निर्माता के बाहर this
गुजरना हमेशा खराब होता है" उनमें से एक नहीं है।
पीटर द्वारा इंगित चेतावनी सभी उपयुक्त और मान्य हैं। यह किसी भी विधि या संदर्भ में this
को किसी भी विधि या संदर्भ में रिसाव करने के लिए निश्चित रूप से समस्याग्रस्त होगा जिसमें संदर्भ अज्ञात या अविश्वसनीय ग्राहकों को प्रकाशित हो जाएगा। किसी भी क्लाइंट कोड, भरोसेमंद या नहीं, के लिए अभी तक पूरी तरह से निर्मित ऑब्जेक्ट के संदर्भ को प्रकाशित करना अभी भी बुरा है, यह धारणा के साथ संचालित होता है कि यह वैध और सुसंगत वस्तु के लिए दृश्य होगा।
जिसके अनुसार, वहाँ बिल्कुल एक पैकेज-निजी विधि उस पर कहते हैं, वस्तुओं एक आम इंटरफेस है, इसलिए का एक समूह एक आम प्रारंभ करता है, के लिए एक निर्माता से this
गुजर के साथ कुछ भी गलत नहीं है, खासकर यदि कि प्रारंभ लंबा है या जटिल।
टीएल; डीआर: निश्चित रूप से कुछ स्थितियां हैं जिनमें मेरी राय में, यह केवल एक निर्माता से this
पास करने के लिए स्वीकार्य नहीं है, बल्कि वास्तव में ऐसा करने के लिए वांछनीय है।
बस इसे मत करो। हमने कुछ साल पहले बनाई गई बग के आसपास काम करने वाले दिनों को बर्बाद कर दिया था जब किसी ने 'विश्वसनीय' 'पैकेज' निजी 'विधि के लिए एक कन्स्ट्रक्टर से' यह 'पारित किया था। समय के साथ, यह विधि बढ़ती जा रही है, और अन-प्रारंभिक उदाहरण एक घटना कतार में आया। निर्माण के बाद बस एक अंतिम init() का उपयोग करें, और एक अज्ञात नायक बनें। – Charlweed
- 1. जावा कन्स्ट्रक्टर
- 2. जावा कन्स्ट्रक्टर अपरिभाषित?
- 3. जावा क्लास कन्स्ट्रक्टर
- 4. जावा जेनेरिक कन्स्ट्रक्टर
- 5. जावा कॉपी कन्स्ट्रक्टर और विरासत
- 6. जावा - Deserialization InvalidClassException (कोई वैध कन्स्ट्रक्टर नहीं)
- 7. जावा: इसे कन्स्ट्रक्टर से बचने की अनुमति क्यों नहीं दी जानी चाहिए?
- 8. जावा: ऑब्जेक्ट क्लास में एक कन्स्ट्रक्टर है?
- 9. इसे कन्स्ट्रक्टर प्रारंभकर्ता सूची से पास कर रहा है
- 10. जेनेरिक प्रकारों का उपयोग कर जावा कन्स्ट्रक्टर
- 11. वैकल्पिक पैरामीटर के साथ जावा कन्स्ट्रक्टर/विधि?
- 12. जावा कन्स्ट्रक्टर और फील्ड प्रारंभिकरण आदेश
- 13. जावा क्लास गतिशील रूप से कन्स्ट्रक्टर पैरामीटर
- 14. निजी कन्स्ट्रक्टर के साथ जावा स्प्रिंग बीन
- 15. जावा में सेटर्स बनाम ओवरलोडेड कन्स्ट्रक्टर
- 16. जावा में डिफ़ॉल्ट कन्स्ट्रक्टर और विरासत
- 17. सी # इंस्टेंस कन्स्ट्रक्टर बनाम स्टेटिक कन्स्ट्रक्टर
- 18. कन्स्ट्रक्टर
- 19. कन्स्ट्रक्टर
- 20. कन्स्ट्रक्टर
- 21. कन्स्ट्रक्टर या कॉपी कन्स्ट्रक्टर?
- 22. कॉपी कन्स्ट्रक्टर और डिफॉल्ट कन्स्ट्रक्टर
- 23. कन्स्ट्रक्टर में कॉल बेस कन्स्ट्रक्टर और अन्य कन्स्ट्रक्टर
- 24. कन्स्ट्रक्टर
- 25. कन्स्ट्रक्टर
- 26. कन्स्ट्रक्टर
- 27. कन्स्ट्रक्टर
- 28. कन्स्ट्रक्टर
- 29. कन्स्ट्रक्टर
- 30. कन्स्ट्रक्टर
http://stackoverflow.com/questions/3921616/java-leaking-this-in-constructor –
FWIW पर एक नज़र डालें, वास्तव में एक सैद्धांतिक JVM सुरक्षा छेद है यदि 'यह' कन्स्ट्रक्टर में बहुत जल्दी लीक हो गया है । लेकिन जेवीएम (माना जाता है) आश्वस्त करता है कि आप इसे जल्दी से रिसाव नहीं कर सकते हैं। –