চূড়ান্ত করার পদ্ধতি, ক্লোজেবল ইন্টারফেস এবং রিসোর্স স্টেটমেন্টের সাথে চেষ্টা করুন (জাভা 7) - 1

"হাই, অ্যামিগো!"

"আমি আপনার সাথে চূড়ান্ত () পদ্ধতি নিয়ে আলোচনা করার সিদ্ধান্ত নিয়েছি ।"

"যদি আপনার মনে থাকে, ফাইনালাইজ() হল একটি বিশেষ পদ্ধতি যা আবর্জনা সংগ্রহকারী এটিকে ধ্বংস করার আগে একটি বস্তু দ্বারা ডাকা হয়।"

"এই পদ্ধতির মূল উদ্দেশ্য হল ফাইল, I/O স্ট্রীম এবং আরও কিছু বন্ধ করে ব্যবহৃত বহিরাগত নন-জাভা সংস্থানগুলিকে মুক্ত করা।"

"দুর্ভাগ্যবশত, এই পদ্ধতিটি আমাদের প্রত্যাশা পূরণ করে না। জাভা ভার্চুয়াল মেশিন একটি বস্তুকে ধ্বংস করা স্থগিত করতে পারে, সেইসাথে চূড়ান্ত পদ্ধতিতে কল করতে পারে, যতক্ষণ এটি চায়। তাছাড়া, এটি গ্যারান্টি দেয় না যে এই পদ্ধতিটি হবে আদৌ বলা হয়। এমন অনেক পরিস্থিতি রয়েছে যেখানে এটি বলা যায় না, সবই "অপ্টিমাইজেশন" নামে।"

"আমি আপনার জন্য দুটি রেফারেন্স পেয়েছি:"

Joshua Bloch এই পদ্ধতি সম্পর্কে একটি ভাল নিবন্ধ লিখেছেন: লিঙ্ক
আমি একটি সংক্ষিপ্ত উদ্ধৃতি ব্যাখ্যা করব:

  1. finalize() শুধুমাত্র দুটি ক্ষেত্রে ব্যবহার করা যেতে পারে:
    1. লগিং সহ সম্পদ যাচাই বা পরিষ্কার করার জন্য।
    2. নেটিভ কোডের সাথে কাজ করার সময় যা রিসোর্স ফাঁসের জন্য গুরুত্বপূর্ণ নয়।
  2. finalize() বস্তু পরিষ্কার করার সময় GC 430 গুণ ধীর করে তোলে
  3. finalize() বলা যাবে না
আমি যদি একটি সাক্ষাত্কারে বলি যে চূড়ান্ত করা একটি ক্ষতিকারক এবং বিপজ্জনক ক্রাচ যার অস্তিত্বই বিভ্রান্তিকর, আমি কি ঠিক বলব?

"ঠিক আছে, এটা আমার দিন তৈরি করেছে, এলি।"

" ফাইনালাইজ মেথড প্রতিস্থাপন করার জন্য জাভা 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();
}

"এটি আরও ভাল, তবে আমি যতটা আশা করেছিলাম ততটা শান্ত নয়।"

"এটা খারাপ না। আপনি এটাতে অভ্যস্ত হয়ে যাবেন। সময়ের সাথে সাথে।"