अंतिम रूप देने की विधि, बंद करने योग्य इंटरफ़ेस, और संसाधनों के साथ प्रयास कथन (जावा 7) - 1

"हाय, अमीगो!"

"मैंने अभी आपके साथ finalize () पद्धति पर चर्चा करने का निर्णय लिया है।"

"यदि आपको याद है, अंतिम रूप () एक विशेष विधि है जिसे कचरा संग्रहकर्ता द्वारा नष्ट करने से पहले किसी वस्तु द्वारा कहा जाता है।"

"इस विधि का मुख्य उद्देश्य फाइलों, आई/ओ स्ट्रीम, और इसी तरह बंद करके उपयोग किए गए बाहरी गैर-जावा संसाधनों को मुक्त करना है।"

"दुर्भाग्य से, यह विधि हमारी अपेक्षाओं पर खरा नहीं उतरती है। जावा वर्चुअल मशीन किसी वस्तु को नष्ट करने के साथ-साथ अंतिम रूप देने की विधि को तब तक के लिए स्थगित कर सकती है, जब तक वह चाहती है। इसके अलावा, यह गारंटी नहीं देता है कि यह विधि होगी बिल्कुल भी बुलाया जाता है। ऐसी कई स्थितियां हैं जहां इसे "अनुकूलन" के नाम पर नहीं बुलाया जाता है।

"मेरे पास आपके लिए दो संदर्भ हैं:"

जोशुआ बलोच ने इस पद्धति के बारे में एक अच्छा लेख लिखा है: लिंक
मैं एक संक्षिप्त अंश की व्याख्या करूंगा:

  1. अंतिम रूप () का उपयोग केवल दो मामलों में किया जा सकता है:
    1. लॉगिंग के साथ संसाधनों की पुष्टि या सफाई के लिए।
    2. देशी कोड के साथ काम करते समय जो संसाधन लीक के लिए महत्वपूर्ण नहीं है।
  2. finalize() वस्तुओं को साफ करने में GC को 430 गुना धीमा कर देता है
  3. finalize() नहीं कहा जा सकता है
अगर मैं एक इंटरव्यू में कहूं कि finalize एक हानिकारक और खतरनाक बैसाखी है जिसका अस्तित्व ही भ्रमित करने वाला है, तो क्या मैं सही होगा?

"खैर, इसने मेरा दिन बना दिया, ऐली।"

"Java 7 में finalize विधि को बदलने के लिए एक नया कथन है। इसे try-with-resource कहा जाता है। यह वास्तव में finalize का प्रतिस्थापन नहीं है , बल्कि यह एक वैकल्पिक दृष्टिकोण है।"

"क्या यह ट्राइ-कैच जैसा है, लेकिन संसाधनों के साथ?"

"यह लगभग ट्राई-कैच की तरह है । चीजें हैं, फाइनलाइज () पद्धति के विपरीत, ट्राइ- कैच-फाइनल स्टेटमेंट में फाइनली ब्लॉक को हमेशा निष्पादित किया जाता है। प्रोग्रामर ने भी इस तकनीक का उपयोग तब किया है जब उन्हें संसाधनों को मुक्त करने की आवश्यकता होती है, करीबी धागे, आदि।
 "यहां एक उदाहरण है:"

InputStream is = null;
try
{
 is = new FileInputStream("c:/file.txt");
 is.read(…);
}
finally
{
 if (is != null)
 is.close();
}

"भले ही कोशिश ब्लॉक ठीक से निष्पादित हो या कोई अपवाद था, अंत में ब्लॉक को हमेशा बुलाया जाएगा, और वहां कब्जे वाले संसाधनों को जारी करना संभव है।"

"तो, जावा 7 में, इस दृष्टिकोण को आधिकारिक बनाने का निर्णय लिया गया, जैसे:"

try(InputStream is = new FileInputStream("c:/file.txt"))
{
 is.read(…);
}

"इस विशेष प्रयास कथन को संसाधनों के साथ प्रयास कहा जाता है (इसी तरह संग्रह के लिए एक विकल्प कहा जाता है )।"

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

"कितना दिलचस्प है! यह संकेतन पिछले वाले की तुलना में कहीं अधिक कॉम्पैक्ट है। मुझे यकीन नहीं है कि मैं इसे अभी तक समझ पाया हूँ।"

"यह उतना मुश्किल नहीं है जितना आप सोचते हैं।"

"तो, क्या मैं कोष्ठक में प्रत्येक वस्तु का वर्ग निर्दिष्ट कर सकता हूँ?"

"हाँ, निश्चित रूप से, अन्यथा कोष्ठकों का बहुत कम उपयोग होगा।"

"और अगर मुझे कोशिश ब्लॉक से बाहर निकलने के बाद दूसरी विधि को कॉल करने की ज़रूरत है, तो मैं इसे कहां रखूं?"

"यहाँ चीजें थोड़ी अधिक सूक्ष्म हैं। Java 7 निम्नलिखित इंटरफ़ेस प्रस्तुत करता है:"

public interface AutoCloseable
{
 void close() throws Exception;
}

"आपकी कक्षा इस इंटरफ़ेस को लागू कर सकती है। और फिर आप इसकी वस्तुओं को एक कोशिश-के-संसाधन कथन के अंदर उपयोग कर सकते हैं। केवल ऐसी वस्तुओं को «स्वचालित बंद» के लिए एक कोशिश-के-संसाधन कथन के कोष्ठकों के अंदर बनाया जा सकता है।

"दूसरे शब्दों में, मुझे अपने ऑब्जेक्ट को «क्लीन अप» करने के लिए क्लोज मेथड को ओवरराइड करना होगा और उसमें कोड लिखना होगा, और मैं दूसरी विधि निर्दिष्ट नहीं कर सकता?

"हाँ। लेकिन आप कई वस्तुओं को निर्दिष्ट कर सकते हैं - बस उन्हें अर्धविराम से अलग करें:"

try(
InputStream is = new FileInputStream("c:/file.txt");
OutputStream os = new FileOutputStream("c:/output.txt")
)
{
 is.read(…);
 os.write(…);
}

"यह बेहतर है, लेकिन उतना अच्छा नहीं है जितना मैंने आशा की थी।"

"यह उतना बुरा नहीं है। आपको इसकी आदत हो जाएगी। समय के साथ।"