2012-07-07 14 views
7

मैंने पढ़ा है (कहीं कहीं) finalize() अभिभावक वर्ग के लिए उप-वर्ग कचरा-संग्रहित होने पर कॉल करने की गारंटी नहीं है, इसका मतलब यह है कि अधिकांश डेवलपर्स उप-वर्ग में finalize() ओवरराइड करते हैं और super.finalize() पर कॉल करते हैं?क्या आप subclass के भीतर super.finalize() को कॉल करते हैं?

+6

प्रभावी जावा - आइटम 7: अंतिमकर्ता से बचें। यदि आप फाइनलाइजर्स का उपयोग करते हैं, तो आपको super.finalize() को कॉल करना चाहिए। – assylias

+0

तो उप-वर्ग कचरा इकट्ठा होने पर सुपर क्लास के लिए अंतिम रूप से कॉल किया जाता है? – user997112

+3

ग्रेट आलेख जो मुझे लगता है प्रासंगिकता है: [क्यों अंतिमकृत संरक्षित है] (http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/)। –

उत्तर

13

अंतिमकरण स्वचालित रूप से सुपर क्लास के लिए नहीं बुलाया जाता है। तो अगर आप को अंतिम रूप देने को ओवरराइड, सुपर वर्ग सुनिश्चित करने के लिए उचित तरीके से साफ हो जाता है हो सकता है

protected void finalize() { 
    try { 
     // do subclass cleanup 
    } 
    finally { 
     super.finalize(); 
    } 
} 

इस संदर्भ लेख http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

यह ध्यान देने योग्य है कि finalizers बहुत उम्मीद के मुताबिक नहीं हैं लायक होना चाहिए देखें और आप डॉन ' अगर वे दौड़ते हैं तो उनका कोई नियंत्रण नहीं होता है। विधियों को अंतिम रूप देने में कुछ भी महत्वपूर्ण नहीं किया जाना चाहिए। सामान्य रूप से यह केवल अपनी कक्षा के स्पष्ट सफाई करने के लिए बेहतर अभ्यास है।

3

किसी भी गैर जावा संसाधनों को साफ करने के लिए अंतिम रूप देने पर भरोसा करना सर्वोत्तम है (कॉल को अंतिम रूप देने की गारंटी नहीं है)। यदि संभव हो, संसाधनों के साथ प्रयास करें (यदि जेडीके 7 का उपयोग कर रहे हैं) या संभवतः अन्य विकल्पों के साथ संसाधनों को साफ करने के लिए प्रयास करें। यदि आप अंतिम रूप देने के लिए जा रहे हैं, तो आप अंत में ब्लॉक करने के प्रयास में super.finalize डाल सकते हैं। संसाधनों को साफ करने के लिए अंतिम रूप देने पर भरोसा करना बुद्धिमान होगा।

// don't make it public! 
protected void finalize() throws Throwable 
{ 
    try 
    { 
    // custom finalization here 
    } 
    finally 
    { 
    super.finalize(); 
    } 
} 

विचार संसाधनों को साफ करने के लिए है, तो यह शायद प्रेत संदर्भ की जाँच करने के लिए बुद्धिमान हो सकता है - एक वस्तु phantomly पहुंचा जा सकता है, तो यह न तो जोरदार/कमजोर/धीरे से पहुंचा जा सकता, को अंतिम रूप दिया जा चुका है & वहाँ पर है कम से कम एक प्रेत संदर्भ (यानी ऑब्जेक्ट को अंतिम रूप दिया गया है लेकिन अभी तक पुनः दावा नहीं किया गया है)।

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