আমার অভিজ্ঞতায়, ওভাররাইডের জন্য একটি এবং একমাত্র কারণ রয়েছে Object.finalize()
তবে এটি খুব ভাল কারণ :
ত্রুটি লগিং কোড স্থাপন করার জন্য finalize()
যা আপনি যদি কখনও অনুরোধ করতে ভুলে যান তবে আপনাকে सूचित করে close()
।
স্থিতিশীল বিশ্লেষণ কেবল তুচ্ছ ব্যবহারের পরিস্থিতিগুলিতেই বাদ পড়তে পারে এবং অন্য উত্তরে উল্লিখিত সংকলক সতর্কতাগুলির মধ্যে এমন কিছু বিষয়গুলির মধ্যে এমন সরল দৃষ্টিভঙ্গি রয়েছে যা অ-তুচ্ছ কিছু করার জন্য আপনাকে আসলে এগুলি অক্ষম করতে হবে। (আমি জানি বা আমি কখনও শুনেছি এমন কোনও প্রোগ্রামারের চেয়ে আমার আরও বেশি সতর্কতা সক্ষম হয়েছে তবে আমার কাছে বোকা সতর্কতা সক্ষম করা হয়নি))
চূড়ান্তকরণ এটি নিশ্চিত করার জন্য একটি উপযুক্ত ব্যবস্থা বলে মনে হতে পারে যে সংস্থানগুলি অনির্বাচিত না হয় তবে বেশিরভাগ লোক একে সম্পূর্ণ ভুল উপায়ে দেখে: তারা একে বিকল্প ফ্যালব্যাক প্রক্রিয়া হিসাবে বিবেচনা করে, একটি "দ্বিতীয় সুযোগ" সুরক্ষাকারী যা স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে তারা যে সম্পদ ভুলে গিয়েছিল তা নিষ্পত্তি করে দিন। এটা মৃত ভুল । যে কোনও নির্দিষ্ট কাজ করার একটি মাত্র উপায় থাকতে হবে: হয় আপনি সর্বদা সমস্ত কিছু বন্ধ করে দেন, বা চূড়ান্তকরণ সর্বদা সবকিছু বন্ধ করে দেয়। তবে চূড়ান্তকরণ যেহেতু অবিশ্বাস্য তাই চূড়ান্তকরণ এটি হতে পারে না।
সুতরাং, সেখানে এই স্কিম যা আমি কল আবশ্যিক নিষ্পত্তি , এবং এটি শর্তাধীন যে প্রোগ্রামার জন্য দায়ী সবসময় স্পষ্টভাবে সবকিছু বন্ধ যা কার্যকরী Closeable
বা AutoCloseable
। (চেষ্টা সহ-সংস্থানসমূহের বিবৃতিটি এখনও স্পষ্ট সমাপ্তির হিসাবে গণনা করে)) অবশ্যই, প্রোগ্রামারটি ভুলে যেতে পারে, তাই এখানে চূড়ান্তকরণ কার্যকর হয়, তবে ম্যাজিক পরী হিসাবে নয় যা শেষ পর্যন্ত ম্যাজিকভাবে জিনিসগুলি তৈরি করবে: যদি চূড়ান্তকরণ আবিষ্কার হয় যে close()
আহ্বান করা হয়নি, এটি নাএটিকে আহ্বান করার চেষ্টা করুন, অবাকভাবে কারণ কারণ সেখানে (গাণিতিক নিশ্চিততার সাথে) এন00 বি প্রোগ্রামারদের সৈন্যদল থাকবে যারা এই কাজটি করার জন্য এটির উপর নির্ভর করবে যে তারা খুব অলস বা খুব অনুপস্থিত মনোযোগী ছিল না। সুতরাং, বাধ্যতামূলক নিষ্পত্তির সাথে সাথে, যখন চূড়ান্তকরণ আবিষ্কার হয় যা close()
আহ্বান করা হয় নি, এটি একটি উজ্জ্বল লাল ত্রুটি বার্তা লগ করে, বড় ধরণের চর্বিযুক্ত সমস্ত মূলধনযুক্ত প্রোগ্রামারকে তার স্ট্রিং - তার জিনিসগুলি ঠিক করতে বলে।
অতিরিক্ত সুবিধা হিসাবে, গুজবটিতে রয়েছে যে "জেভিএম একটি তুচ্ছ চূড়ান্তকরণ পদ্ধতি () অবজ্ঞা করবে (উদাহরণস্বরূপ যা কেবল কিছুই না করে ফিরে আসে, অবজেক্ট শ্রেণিতে সংজ্ঞায়িত পদ্ধতিটির মতো)", তাই বাধ্যতামূলক নিষ্পত্তি দিয়ে আপনি সমস্ত চূড়ান্তকরণ এড়াতে পারবেন আপনার পুরো সিস্টেমে ওভারহেড ( এই ওভারহেডটি কতটা ভয়ঙ্কর তার তথ্যের জন্য আলিপের উত্তর দেখুন ) আপনার finalize()
পদ্ধতিটি এভাবে কোড করে:
@Override
protected void finalize() throws Throwable
{
if( Global.DEBUG && !closed )
{
Log.Error( "FORGOT TO CLOSE THIS!" );
}
//super.finalize(); see alip's comment on why this should not be invoked.
}
এর পিছনে ধারণাটি Global.DEBUG
হ'ল একটি static final
পরিবর্তনশীল যার মান সংকলনের সময় জানা যায়, সুতরাং যদি এটি হয় false
তবে সংকলক পুরো if
বিবৃতিটির জন্য কোনও কোডই নির্গত করবে না , যা এটি একটি তুচ্ছ (খালি) চূড়ান্তরূপে পরিণত করবে, যা পরিবর্তিত হয় মানে আপনার ক্লাসটিকে এমন চিকিত্সা করা হবে যেন তার চূড়ান্তকরণকারী নেই। (সি # এ এটি একটি দুর্দান্ত #if DEBUG
ব্লক দিয়ে করা হবে , তবে আমরা কী করতে পারি, এটি জাভা, যেখানে আমরা মস্তিষ্কে অতিরিক্ত ওভারহেড সহ কোডটিতে সুস্পষ্ট সরলতা প্রদান করি))
ডট নেট-এ রিসোর্সগুলি নিষ্পত্তি করার বিষয়ে অতিরিক্ত আলোচনার সাথে বাধ্যতামূলক নিষ্পত্তি সম্পর্কে আরও: এখানে মাইকেল: র: বাধ্যতামূলক নিষ্পত্তি বনাম "ডিসপোজ-ডিসপোজিং" জঘন্য আচরণ
finalize()
কিছুটা গণ্ডগোল করে। আপনি যদি কখনও এটিকে বাস্তবায়ন করেন তবে নিশ্চিত করুন যে এটি একই বস্তুর অন্য সমস্ত পদ্ধতির সাথে থ্রেড-নিরাপদ।