இறுதி முறை, மூடக்கூடிய இடைமுகம் மற்றும் ஆதாரங்களுடன் முயற்சி செய்யும் அறிக்கை (ஜாவா 7) - 1

"வணக்கம், அமிகோ!"

" உங்களுடன் இறுதி () முறையைப் பற்றி விவாதிக்க முடிவு செய்தேன் ."

"உங்களுக்கு நினைவில் இருந்தால், இறுதி () என்பது ஒரு சிறப்பு முறையாகும், இது குப்பை சேகரிப்பவர் அதை அழிக்கும் முன் ஒரு பொருளால் அழைக்கப்படும்."

"இந்த முறையின் முக்கிய நோக்கம் கோப்புகள், I/O ஸ்ட்ரீம்கள் மற்றும் பலவற்றை மூடுவதன் மூலம் பயன்படுத்தப்படும் வெளிப்புற ஜாவா அல்லாத ஆதாரங்களை விடுவிக்க வேண்டும்."

"துரதிர்ஷ்டவசமாக, இந்த முறை எங்கள் எதிர்பார்ப்புகளுக்கு ஏற்ப வாழவில்லை. ஜாவா மெய்நிகர் இயந்திரம் ஒரு பொருளை அழிப்பதைத் தள்ளிப்போடலாம், அதே போல் இறுதி செய்யும் முறையை அது விரும்பும் வரை அழைக்கலாம். மேலும், இந்த முறை இருக்கும் என்பதற்கு இது உத்தரவாதம் அளிக்காது. அழைக்கப்படாத சூழ்நிலைகள் ஏராளமாக உள்ளன, அனைத்தும் "உகப்பாக்கம்" என்ற பெயரில்."

"உங்களுக்காக என்னிடம் இரண்டு குறிப்புகள் உள்ளன:"

ஜோசுவா ப்ளாச் இந்த முறையைப் பற்றி ஒரு நல்ல கட்டுரையை எழுதியுள்ளார்: இணைப்பு
நான் ஒரு சிறிய பகுதியை சுருக்கமாக கூறுவேன்:

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

"இந்த சிறப்பு முயற்சி அறிக்கை ஆதாரங்களுடன் முயற்சி என்று அழைக்கப்படுகிறது ( ஃபோர்ச் என அழைக்கப்படுவதற்கு சேகரிப்புகள் எவ்வாறு மாற்றாக உள்ளது என்பதைப் போன்றது )."

"முயற்சிக்குப் பிறகு, மாறிகள் அறிவிக்கப்பட்டு, பொருள்கள் உருவாக்கப்படும் அடைப்புக்குறிகள் உள்ளன என்பதைக் கவனியுங்கள். சுருள் அடைப்புக்குறிகளால் சுட்டிக்காட்டப்பட்ட முயற்சித் தொகுதிக்குள் இந்த பொருட்களைப் பயன்படுத்தலாம். முயற்சித் தொகுதியானது செயல்படுத்தப்பட்டதும், அது சாதாரணமாக முடிகிறதா இல்லையா என்பதைப் பொருட்படுத்தாமல். ஒரு விதிவிலக்காக இருந்தது, அடைப்புக்குறிக்குள் உருவாக்கப்பட்ட எந்தப் பொருளிலும் மூட() முறை அழைக்கப்படும்."

"எவ்வளவு சுவாரசியம்! இந்த குறிப்பு முந்தையதை விட மிகவும் கச்சிதமானது. எனக்கு இன்னும் புரியவில்லை."

"நீங்கள் நினைப்பது போல் இது கடினம் அல்ல."

"எனவே, அடைப்புக்குறிக்குள் ஒவ்வொரு பொருளின் வகுப்பையும் நான் குறிப்பிடலாமா?"

"ஆம், நிச்சயமாக, இல்லையெனில் அடைப்புக்குறிகள் சிறிதளவு உபயோகமாக இருக்கும்."

"முயற்சி பிளாக்கில் இருந்து வெளியேறிய பிறகு நான் வேறு முறையை அழைக்க வேண்டும் என்றால், அதை எங்கே வைப்பது?"

"இங்கே விஷயங்கள் கொஞ்சம் நுட்பமானவை. ஜாவா 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();
}

"அது சிறந்தது, ஆனால் நான் எதிர்பார்த்தது போல் இல்லை."

"அவ்வளவு மோசம் இல்லை. நீயும் பழகிக் கொள்வாய். காலப்போக்கில்."