উত্তর:
জোশুয়া ব্লচের কার্যকর জাভা (দ্বিতীয় সংস্করণ) অনুসারে, কার্যকর হলে দুটি পরিস্থিতি রয়েছে finalize()
:
একটি হ'ল "সুরক্ষা জাল" হিসাবে কাজ করা যদি কোনও বস্তুর মালিক তার স্পষ্ট সমাপ্তির পদ্ধতিটি কল করতে ভুলে যায়। যদিও চূড়ান্তকরণকারীকে তাত্ক্ষণিকভাবে আহ্বান করা হবে তার কোন গ্যারান্টি নেই, তবে ক্লায়েন্ট যখন স্পষ্টভাবে সমাপ্তির পদ্ধতিতে কল করতে ব্যর্থ হয় তখন সেই ক্ষেত্রে (আশাকরি বিরল) ক্ষেত্রে কখনই দেরি না করে রিসোর্সটি মুক্ত করা ভাল। তবে চূড়ান্তকরণকারীর একটি সতর্কতা লগ করা উচিত যদি এটি সন্ধান করে যে সংস্থানটি বন্ধ করা হয়নি
চূড়ান্তকরণকারীর দ্বিতীয় বৈধ ব্যবহার দেশী সমবয়সীদের সাথে সম্পর্কিত বিষয়গুলিকে উদ্বেগ করে। নেটিভ পিয়ার হ'ল নেটিভ অবজেক্ট, যেখানে একটি সাধারণ অবজেক্ট দেশীয় পদ্ধতিতে প্রতিনিধিত্ব করে। নেটিভ পিয়ার সাধারণ জিনিস না হওয়ায়, আবর্জনা সংগ্রহকারী এটি সম্পর্কে জানেন না এবং জাভা পিয়ারটি পুনরায় দাবি করা হলে এটি পুনরায় দাবি করতে পারবেন না। এই কাজটি সম্পাদন করার জন্য একটি চূড়ান্তরক্ষক হ'ল উপযুক্ত বাহন, ধরে নেওয়া দেশীয় পিয়ারের কাছে কোনও সমালোচনামূলক সংস্থান নেই। নেটিভ পিয়ারের যদি এমন সংস্থান থাকে যেগুলি অবশ্যই অবিলম্বে সমাপ্ত করা উচিত, তবে শ্রেণীর একটি সুস্পষ্ট সমাপ্তি পদ্ধতি থাকতে হবে, যা উপরে বর্ণিত আছে। সমাপ্তির পদ্ধতিটি সমালোচনামূলক সংস্থান মুক্ত করার জন্য যা করা উচিত তা করা উচিত।
আরও পড়ার জন্য, আইটেম 7, পৃষ্ঠা 27 দেখুন।
ফাইনালাইজারগুলি দেশীয় সম্পদ পরিচালনার জন্য গুরুত্বপূর্ণ। উদাহরণস্বরূপ, আপনার অবজেক্টের অপারেটিং সিস্টেম থেকে একটি জাভা-নন এপিআই ব্যবহার করে একটি উইজেটহ্যান্ডেল বরাদ্দ করার প্রয়োজন হতে পারে। আপনি যদি সেই উইজেটহ্যান্ডলটি প্রকাশ না করেন যদি আপনার বস্তুটি GC'd হয়, আপনি উইজেটহ্যান্ডলগুলি ফাঁস হবেন।
গুরুত্বপূর্ণ বিষয়টি হ'ল "চূড়ান্তকরণকারীকে কখনই বলা হয় না" কেসগুলি কেবল ভেঙে ফেলা হয়:
এই তিনটি ক্ষেত্রেই আপনার হয় একটি নেটিভ ফাঁস নেই (আপনার প্রোগ্রামটি আর চলছে না এর কারণেই) বা আপনার ইতিমধ্যে একটি অ-নেটিভ ফুটো আছে (যদি আপনি তাদের পরিচালনা না করে পরিচালিত বস্তু বরাদ্দ রাখেন তবে GC'd)।
"ফাইনালাইজার বলা হচ্ছে তার উপর নির্ভর করবেন না" সতর্কতাটি আসলে প্রোগ্রাম লজিকের জন্য ফাইনালাইজার ব্যবহার না করা সম্পর্কিত। উদাহরণস্বরূপ, আপনি নির্মাণের সময় কোথাও কোনও ফাইলের কাউন্টার বাড়িয়ে এবং ফাইনালাইজারে এটি হ্রাস করে আপনার প্রোগ্রামের সমস্ত উদাহরণ জুড়ে আপনার কতগুলি অবজেক্ট রয়েছে তা ট্র্যাক রাখতে চান না - কারণ আপনার বস্তুগুলির কোনও নিশ্চয়তা নেই চূড়ান্ত করা হবে, এই ফাইলের কাউন্টারটি সম্ভবত কখনও 0 এ ফিরে যাবে না really এটি আপনার আরও সাধারণ নীতিমালার একটি বিশেষ ঘটনা যা আপনার প্রোগ্রামটি সাধারণত বন্ধ হওয়া (পাওয়ার ব্যর্থতা ইত্যাদির উপর নির্ভর করে না)।
নেটিভ রিসোর্স পরিচালনার জন্য, যদিও, ফাইনালাইজারটি চালিত না হওয়া মামলাগুলি না চালানো হয় সে ক্ষেত্রে আপনার যত্ন নেই to
close()
তবে এটি অ্যাক্সেসযোগ্য হওয়ার আগে কখনও ডাকা হয় না) বলার অপেক্ষা রাখে
এই পদ্ধতিটির উদ্দেশ্য নীচে এপিআই ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে:
জাভা ভার্চুয়াল মেশিনটি যদি নির্ধারণ করে থাকে যে আর কোনও উপায় নেই যার দ্বারা এই বস্তুটি এখনও মারা যায় নি এমন কোনও থ্রেড দ্বারা অ্যাক্সেস করা যায়, অন্য কোনও বস্তুর চূড়ান্তকরণের দ্বারা গৃহীত কোনও পদক্ষেপের ফলস্বরূপ বা ক্লাস যা চূড়ান্ত হতে প্রস্তুত ...
finalize
... এর সাধারণ উদ্দেশ্য হ'ল অব্যবহৃতভাবে বাতিল করার আগে ক্লিনআপ ক্রিয়া করা । উদাহরণস্বরূপ, কোনও ইনপুট / আউটপুট সংযোগ উপস্থাপন করে এমন কোনও অবজেক্টের চূড়ান্তকরণ পদ্ধতিটি স্থায়ীভাবে বাতিল করার আগে এই সংযোগটি ভাঙ্গার জন্য সুস্পষ্ট I / O লেনদেন সম্পাদন করতে পারে ...
যদি আপনি অতিরিক্তভাবে ভাষা ডিজাইনারদের কেন বেছে নিয়েছেন যে "বস্তুটি অকাট্যভাবে বাতিল করা হয়" ( আবর্জনা সংগ্রহ করা ) যেভাবে অ্যাপ্লিকেশন প্রোগ্রামার নিয়ন্ত্রণের বাইরে ("আমাদের কখনই নির্ভর করা উচিত নয়)" বেছে নেওয়া হয়েছে, সে সম্পর্কিত একটি উত্তরে এটি ব্যাখ্যা করা হয়েছে প্রশ্ন :
স্বয়ংক্রিয় আবর্জনা সংগ্রহ ... প্রোগ্রামিং ত্রুটিগুলির পুরো ক্লাসগুলি সরিয়ে দেয় যা সি এবং সি ++ প্রোগ্রামারদের বিভাইড করে। আপনি জাভা কোডটি আত্মবিশ্বাসের সাথে বিকাশ করতে পারেন যে সিস্টেমটি অনেকগুলি ত্রুটি দ্রুত খুঁজে পাবে এবং আপনার উত্পাদন কোডটি প্রেরণ না হওয়া অবধি বড় সমস্যাগুলি সুপ্ত হবে না ..
পরিবর্তে, জাভা ডিজাইনের লক্ষ্যগুলি সম্পর্কে সরকারী দস্তাবেজ থেকে নেওয়া হয়েছিল , এই কারণেই জাভা ভাষার ডিজাইনাররা কেন এইভাবে সিদ্ধান্ত নিয়েছিল তা ব্যাখ্যা করে এটি অনুমোদনযোগ্য রেফারেন্স হিসাবে বিবেচনা করা যেতে পারে।
এই পছন্দটির আরও বিশদ এবং ভাষা অজ্ঞাব্য আলোচনার জন্য, ওওএসসি বিভাগ 9.6 দেখুন স্বয়ংক্রিয় মেমরি পরিচালনা (আসলে, আপনি কেবল এই বিভাগে আগ্রহী না হন তবে এই বিভাগটিই নয় তবে পুরো অধ্যায়টি 9 পড়ার পক্ষে খুব মূল্যবান)। এই বিভাগটি একটি দ্ব্যর্থহীন বিবৃতি দিয়ে খোলে:
একটি ভাল ওও পরিবেশের এমন একটি স্বয়ংক্রিয় মেমরি পরিচালনার ব্যবস্থা করা উচিত যা অ্যাক্সেসযোগ্য অবজেক্টগুলিকে সনাক্ত এবং পুনরায় দাবি জানাতে সক্ষম হবে, অ্যাপ্লিকেশন বিকাশকারীদের তাদের কাজ - অ্যাপ্লিকেশন বিকাশে মনোনিবেশ করার অনুমতি দেবে।
পূর্ববর্তী আলোচনার পর্যায়ে এ জাতীয় সুবিধাগুলি পাওয়া কতটা জরুরি তা বোঝাতে যথেষ্ট হবে। মাইকেল শোয়েইজার এবং ল্যামবার্ট স্ট্রেথারের ভাষায়:
স্বয়ংক্রিয় মেমরি পরিচালনা ছাড়াই কোনও অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামটি সেফটি ভালভ ছাড়াই মোটামুটি একটি প্রেসার কুকারের মতো: শীঘ্রই বা পরে জিনিসটি ফুটিয়ে তোলা নিশ্চিত!
ফাইনালাইজারগুলি উপস্থিত রয়েছে কারণ তারা জিনিসগুলি পরিষ্কার হওয়ার বিষয়টি নিশ্চিত করার কার্যকর উপায় হতে পারে বলে আশা করা হয়েছিল (যদিও বাস্তবে তারা তা নয়), এবং কারণ যখন তারা আবিষ্কার হয়েছিল, পরিষ্কার করার বিষয়টি নিশ্চিত করার আরও ভাল উপায় (যেমন ভুতের রেফারেন্স এবং চেষ্টা করে দেখুন) -res উত্স) এখনও উপস্থিত ছিল না। অন্ধকারে, জাভা তার "চূড়ান্তকরণ" সুবিধাটি প্রয়োগের জন্য পরিচ্ছন্নতার অন্যান্য উপায়ে ব্যয় করা হলেও সম্ভবত জাভাটি আরও ভাল ছিল যখন জাভা প্রাথমিকভাবে বিকশিত হওয়ার সময় এটি খুব কমই স্পষ্ট ছিল।
কভ্যাট: আমি হয়তো পুরানো হয়ে গেছি, তবে কয়েক বছর আগের মত এটি আমার বোঝার বিষয়:
সাধারণভাবে, কোনও ফাইনালাইজার কখন চলবে - বা এটি একেবারেই চালিত হয় তার কোনও গ্যারান্টি নেই, যদিও কিছু জেভিএম আপনাকে প্রোগ্রামটি বন্ধ হওয়ার আগে একটি সম্পূর্ণ জিসি এবং চূড়ান্তকরণের জন্য অনুরোধ জানাবে (অবশ্যই, এর অর্থ এই যে প্রোগ্রামটি আরও বেশি সময় নেয় প্রস্থান করতে এবং এটি অপারেশনের ডিফল্ট মোড নয়)।
এবং কিছু জিসি চূড়ান্তভাবে জিসি'র বস্তুগুলিকে চূড়ান্তভাবে বিলম্বিত করতে বা এড়ানোর জন্য পরিচিত ছিল যা চূড়ান্তকরণকারী ছিল, এই আশায় যে এটি বেঞ্চমার্কগুলিতে আরও ভাল পারফরম্যান্স তৈরি করতে পারে।
এই আচরণগুলি দুর্ভাগ্যক্রমে মূল কারণগুলির সাথে বিরোধী যারা চূড়ান্তরূপে সুপারিশ করা হয়েছিল এবং পরিবর্তে সুস্পষ্টভাবে ডাকা শাটডাউন পদ্ধতি ব্যবহারের জন্য উত্সাহিত করেছে।
যদি আপনার এমন কোনও জিনিস থাকে যা ফেলে দেওয়ার আগে সত্যিই পরিষ্কার করতে হয় এবং আপনি যদি ব্যবহারকারীদের এটি করতে সত্যই বিশ্বাস করতে না পারেন তবে একটি ফাইনালাইজার এখনও বিবেচনা করার মতো হতে পারে। তবে সাধারণভাবে, এখানে বেশ কয়েকটি ভালো কারণ রয়েছে যা আপনি প্রাথমিক জাভা কোডটিতে প্রায়শই দেখেন নি যতটা প্রাথমিক উদাহরণগুলির মধ্যে আপনি করেছিলেন।
গুগল জাভা স্টাইল গাইড বিষয়ে কিছু ঋষি পরামর্শ আছে:
ওভাররাইড করা এটি অত্যন্ত বিরল
Object.finalize
।টিপ : এটি করবেন না। যদি আপনার অবশ্যই আবশ্যক, প্রথমে কার্যকর জাভা আইটেম 7 টি পড়ুন এবং বুঝতে হবে "ফাইনালাইজারদের এড়ান," খুব সাবধানতার সাথে এবং তারপরে এটি করবেন না।
PhantomReference
এবং এর ReferenceQueue
পরিবর্তে নিজেরাই এটি তৈরি করতে চান ।
PhantomReference
এটি আরও ভাল সমাধান। ফাইনালাইজাররা জাভা শুরুর দিনগুলি থেকে ছেড়ে আসা একটি মশালাকে পছন্দ করে Object.clone()
এবং কাঁচা ধরণের ভাষা ভুলে যাওয়া ভাষার একটি অংশ।
জাভা ভাষা স্পেসিফিকেসন (জাভা SE 7) বলে:
ফাইনালাইজাররা এমন সংস্থানগুলি মুক্ত করার সুযোগ দেয় যা কোনও স্বয়ংক্রিয় স্টোরেজ ম্যানেজার দ্বারা স্বয়ংক্রিয়ভাবে মুক্তি দেওয়া যায় না। এই ধরনের পরিস্থিতিতে, কেবল কোনও বস্তুর দ্বারা ব্যবহৃত স্মৃতি পুনরুদ্ধার করা গ্যারান্টি দেয় না যে এটি যে সংস্থানগুলি রেখেছিল তা পুনরায় আদায় করা হবে।