2012-06-30 12 views
5

starting a thread inside the constructor is not a good idea पर स्टैक ओवरफ़्लो पर एक प्रश्न है। मुझे एहसास हुआ कि ऐसी चीज का नतीजा यह होगा कि 'यह' बच निकल सकता है। मैंने यह भी पढ़ा कि publishing a EventListener from constructor भी इसी कारण से एक बुरा विचार है। अन्य पैटर्न क्या हैं जिनके बारे में मुझे अवगत होना चाहिए जिसमें 'यह' बच सकता है?जावा में 'यह' कैसे बच सकता है, इसके विभिन्न तरीके क्या हैं?

+1

एक महत्वपूर्ण भेद यह है कि 'यह' पूरी तरह से निर्मित होने की अनुमति देने से पहले आंशिक अवस्था में भाग जाता है। – phatfingers

उत्तर

4

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

public class Main 
{ 
    private class MyListener extends MouseAdapter { ...} 

    public Main() { 
    class Listener1 extends MouseAdapter { ... } 
    someSwingComponent.addMouseListener(new MyListener()); // inner class 
    someSwingComponent.addMouseListener(new Listener1()); // local class 
    someSwingComponent.addFocusListener(new FocusAdapter() { ... }); // anonymous 
    } 
} 

इन सभी मामलों में this होगा एक विधि तर्क के रूप में पारित वस्तु का संलग्न उदाहरण हो। यदि, दूसरी तरफ, आप static नेस्टेड क्लास घोषित करते हैं, तो में एक संलग्न उदाहरण नहीं होगा।

+0

तो क्या मैं मान सकता हूं कि 'यह' लीक हो सकता है जब भी 'यह' एक विदेशी विधि के लिए तर्क के रूप में पारित किया जाता है (एक वर्ग 'फू' के लिए एक विदेशी तरीके हैं जिन पर इसका कोई नियंत्रण नहीं होता है और इसका मतलब अन्य वर्गों के तरीकों से हो सकता है या स्वयं के गैर निजी/ओवरराइड करने योग्य तरीकों)? – Inquisitive

+0

मुझे लगता है कि मैंने अपनी वाक्य को पहले वाक्य में पर्याप्त स्पष्ट नहीं किया है। मेरा मतलब था "इस वस्तु का कोई उदाहरण विधि" (जिसकी कन्स्ट्रक्टर निष्पादित की जा रही है)। जहां तक ​​विदेशी तरीकों से, उनके पहुंच स्तर से कोई फर्क नहीं पड़ता। क्या मायने रखता है कि क्या आप इस विधि को 'इस' से गुजर रहे हैं --- या तो एक आंतरिक वर्ग के उदाहरण के माध्यम से स्पष्ट रूप से या स्पष्ट रूप से। –