2011-03-09 13 views
5

यदि मैंने MouseListener को Component#addMouseListener() का उपयोग करके जोड़ा है तो मैंने इसे removeMouseListener() का उपयोग करके निकालने के लिए बाध्य किया है?क्या मैं removeMouseListener() को कॉल करने के लिए बाध्य हूं?

मैं विशेष रूप से इस तरह की स्मृति रिसाव के संदर्भ में सोच रहा हूं कि javax.swing.Timerstop() नहीं कहा जा सकता है।

मुझे यह कहने के लिए प्रलेखन में कुछ भी नहीं मिला है कि श्रोताओं को हटा दिया जाना चाहिए, लेकिन शायद मैं सोच रहा हूं कि यह ऐसा कुछ है जिसे लेखक द्वारा माना जा सकता है। शायद।

जेडीके स्रोत का निरीक्षण करने से पता चलता है कि माउस श्रोताओं में संदर्भों की अनुपस्थिति में स्वयं इसे रोक देगा, श्रोता की उपस्थिति एक योग्य घटक को जीसीडी होने से नहीं रोकेगी।

मुझे लगता है कि अधिकतम "यह माफी से बेहतर सुरक्षित है" दिया गया है, मैं वास्तव में पूछ रहा हूं कि कोई मुझे कुछ दस्तावेज पर इंगित कर सकता है जो इंगित करता है कि माउस श्रोताओं को हटाने के लिए अनिवार्य नहीं है, या अधिक सामान्य मामला कोई श्रोता

उत्तर

4

यह इस बात पर निर्भर करता है कि श्रोताओं के संदर्भ में अन्य वस्तुएं क्या हैं, और श्रोता के पास घटक का संदर्भ है या नहीं। मैंने स्विंग कोड को थोड़ा सा देखा है और, जैसा कि मैं सबसे अच्छा कह सकता हूं, श्रोता पंजीकरण उनके श्रोताओं के लिए मजबूत संदर्भ रखता है।

यदि आपने addMouseListener(new MouseListener()...) जैसे addMouseListener को अपने कॉल में एक नया श्रोता बनाया है तो आपको श्रोता को स्पष्ट रूप से पंजीकरण रद्द किए बिना ठीक होना चाहिए। जब कचरा कलेक्टर घटक की जांच करता है, तो श्रोता घटक के बाहर दृढ़ता से पहुंच योग्य नहीं होता है, इसलिए यह कचरा कलेक्टर को घटक को पुनः प्राप्त करने से नहीं रोकेगा।

हालांकि, अगर आप कुछ इस तरह है:

public class Foo implements MouseListener { 
    ... 
    private Component c; 
    public void registerWithComponent(final Component c) { 
     c.addMouseListener(this); 
     this.c = c; 
    } 
} 

तो घटक कचरा कलेक्टर द्वारा जब तक आपके फू उदाहरण भी पुन: दावा है (या फिर से दावा किया जा सकता है) फिर से दावा नहीं किया जा सकता है, और आप शायद चाहिए MouseListener को हटाने के लिए एक स्पष्ट कॉल करें।

+0

यह मैं से क्या देख रहा हूँ की पुष्टि करता है जेडीके स्रोत कोड। मुझे लगता है कि मैं इससे अधिक मजबूत गारंटी की तलाश में था, लेकिन ऐसा लगता है कि ऐसी गारंटी किसी भी दस्तावेज में मौजूद नहीं है जो मुझे मिल सकती है। – msandiford

1

आप उन्हें तब तक नहीं हटाते जब तक कि आप उस व्यवहार को नहीं चाहते हैं।

जावा में जीसी कोई शेष संदर्भ के साथ किसी भी वस्तुओं को साफ (जैसे घटक GC'd है और आप MouseListener कहीं और के लिए एक संदर्भ पकड़े नहीं कर रहे हैं)

+1

निश्चित रूप से, लेकिन मैं कैसे सुनिश्चित कर सकता हूं कि जेडीके/स्विंग घटक के बाहर अतिरिक्त संदर्भ नहीं रखता है? – msandiford