Saturday, March 25, 2017

Try-with-resource statement in java

প্রোগ্রামের কাজ শেষ হয়ে গেলে যে অবজেক্টগুলোকে ক্লোজ করে দেওয়া অত্যাবশ্যক সেগুলোকে রিসোর্স (Resource) বলা হয়। যেমন, FileOutputStream, BufferRedear। এই ক্লাসগুলো java.io.Cloasble ই্ন্টারফেসকে ইমপ্লিমেন্ট করে।


উপরের ইন্টারফেসটিতে দেখা যাচ্ছে যে close() মেথডটি IOException থ্রো করে যা একটি চেকড এক্সেপশন। চেকড এক্সেপশন সবসময় হ্যান্ডেল করতে হয়। এর অর্থ হচ্ছে, এই মেথডটি কল করতে গেলে অবশ্যই try-catch ব্লকের ভেতরে তা কল করতে হবে। উদাহরণ হিসেবে নিচের মেথডটি খেয়াল করা যাক,


উপরের মেথডটিতে close() মেথডটি finally ব্লকের মধ্যে কল করা হয়েছে। এর কারণ প্রোগ্রামটির কাজ শেষ হলেই আমরা রিসোর্স ক্লোজ করতে পারি। এই কোড ব্লক দেখেই মনে হচ্ছে কাজটুকু খুবই বিরক্তিকর। একটি ছোট কাজের জন্য অনেক কোড লিখতে হচ্ছে। এই বিরক্তি দূর করতে জাভা 7 এ নতুন একটি ফিচার সংযুক্ত করা হয়েছে যাকে বলে try-with-resource স্টেটমেন্ট। উপরের মেথডটিকে try-with-resource স্টেটমেন্ট ব্যবহার করে লিখলে দাঁড়ায়,



দুটি কোড মেথড যদিও একই কাজ করে, কিন্তু নিচের মেথডটিকে কম সংখ্যক লাইন কোড রয়েছে উপরের মেথডটি থেকে এবং এতে close() মেথডটি কল করা হয়নি।

এবার নিচের লাইনটি ভালো করে লক্ষ করা যাক,

try (FileInputStream fis = new FileInputStream("file.txt"))

এটি একটি try-with-resource স্টেটমেন্ট। FileInputStream এর ভ্যারিয়েবলটি try কিওয়ার্ডের ভেতরে ডিক্লেয়ার করা হয়েছ এবং ইনস্ট্যানসিয়েট করা হয়েছে। এখানে যখন এই try ব্লক শেষ হয়ে যাবে তখন FileInputStream রিসোর্সটি নিজে থেকেই ক্লোজ হয়ে যাবে। এটি সম্ভব হবে কারণ FileInputStream ক্লাসটি AutoCloseable ইন্টারফেসকে ইমপ্লিমেন্ট করে। যে সব ক্লাসগুলো এই ইন্টারফেসকে ইমপ্লিমেন্ট করে, তাদের প্রত্যেকের ক্ষেত্রে এই try-with-resource স্টেটমেন্ট ব্যবহার করা যাবে।

একাধিক রিসোর্সের ক্ষেত্রেও এই try-with-resource স্টেটমেন্ট ব্যবহার করা যায়। যেমন,


এক্ষেত্রে FileInputStream এবং BufferInputStream দুটি ক্লাসই try ব্লক শেষ হওয়ার সঙ্গে সঙ্গেই ক্লোজ হয়ে যাবে।