अंतिम पद्धत, बंद करण्यायोग्य इंटरफेस आणि संसाधनांसह प्रयत्न करा विधान (जावा 7) - 1

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

"मी नुकतेच तुमच्याशी फायनल () पद्धतीवर चर्चा करण्याचे ठरवले आहे ."

"तुम्हाला आठवत असेल तर, finalize() ही एक विशेष पद्धत आहे जी कचरा गोळा करणाऱ्या वस्तू नष्ट करण्यापूर्वी कॉल केली जाते."

"या पद्धतीचा मुख्य उद्देश फायली, I/O प्रवाह, इत्यादी बंद करून वापरलेले बाह्य-जावा संसाधने मोकळे करणे आहे."

"दुर्दैवाने, ही पद्धत आमच्या अपेक्षेनुसार चालत नाही. Java व्हर्च्युअल मशीन एखादी वस्तू नष्ट करणे पुढे ढकलू शकते, तसेच फायनल मेथड कॉल करणे, जोपर्यंत पाहिजे तोपर्यंत पुढे ढकलू शकते. शिवाय, ही हमी देत ​​​​नाही की ही पद्धत असेल. अजिबात म्हणतात. अशा अनेक परिस्थिती आहेत जेथे ते कॉल केले जात नाही, सर्व «ऑप्टिमायझेशन» च्या नावावर आहे."

"माझ्याकडे तुमच्यासाठी दोन संदर्भ आहेत:"

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

  1. finalize() फक्त दोन प्रकरणांमध्ये वापरले जाऊ शकते:
    1. लॉगिंगसह संसाधने सत्यापित करण्यासाठी किंवा साफ करण्यासाठी.
    2. संसाधन लीकसाठी गंभीर नसलेल्या मूळ कोडसह कार्य करताना.
  2. finalize() वस्तू साफ करताना GC 430 पट हळू करते
  3. finalize() कॉल केले जाऊ शकत नाही
जर मी एका मुलाखतीत म्हंटले की फायनलाइज हा एक हानिकारक आणि धोकादायक क्रॅच आहे ज्याचे अस्तित्वच गोंधळात टाकणारे आहे, तर मी बरोबर आहे का?

"बरं, यामुळे माझा दिवस गेला, एली."

"Java 7 मध्ये फायनलाईज मेथड बदलण्यासाठी एक नवीन स्टेटमेंट आहे . याला ट्राय-विथ-रिसोसेस म्हणतात. हे फायनलाइजसाठी रिप्लेसमेंट नाही तर पर्यायी पध्दत आहे."

"हे ट्राय-कॅचसारखे आहे, परंतु संसाधनांसह?"

"हे जवळजवळ ट्राय-कॅच सारखे आहे . गोष्टी, फायनलाइज () पद्धतीच्या विपरीत, ट्राय- कॅच-फायनल स्टेटमेंटमधील शेवटी ब्लॉक नेहमी अंमलात आणला जातो. प्रोग्रामरना जेव्हा संसाधने मोकळी करण्याची आवश्यकता असते तेव्हा हे तंत्र देखील वापरले जाते, थ्रेड्स इ. बंद करा.
 "हे एक उदाहरण आहे:"

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();
}

"ते चांगले आहे, पण माझ्या अपेक्षेइतके छान नाही."

"ते काही वाईट नाहीये. तुला सवय होईल. कालांतराने."