চূড়ান্তকরণের পদ্ধতিটি কেন জাভার অন্তর্ভুক্ত?


44

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

কোনও প্রোগ্রামিং ভাষায় এমন একটি ফাংশন অন্তর্ভুক্ত করা ভয়ানক সিদ্ধান্তের মতো বলে মনে হয় যা ডাকা হতে পারে

উত্তর:


41

জোশুয়া ব্লচের কার্যকর জাভা (দ্বিতীয় সংস্করণ) অনুসারে, কার্যকর হলে দুটি পরিস্থিতি রয়েছে finalize():

  1. একটি হ'ল "সুরক্ষা জাল" হিসাবে কাজ করা যদি কোনও বস্তুর মালিক তার স্পষ্ট সমাপ্তির পদ্ধতিটি কল করতে ভুলে যায়। যদিও চূড়ান্তকরণকারীকে তাত্ক্ষণিকভাবে আহ্বান করা হবে তার কোন গ্যারান্টি নেই, তবে ক্লায়েন্ট যখন স্পষ্টভাবে সমাপ্তির পদ্ধতিতে কল করতে ব্যর্থ হয় তখন সেই ক্ষেত্রে (আশাকরি বিরল) ক্ষেত্রে কখনই দেরি না করে রিসোর্সটি মুক্ত করা ভাল। তবে চূড়ান্তকরণকারীর একটি সতর্কতা লগ করা উচিত যদি এটি সন্ধান করে যে সংস্থানটি বন্ধ করা হয়নি

  2. চূড়ান্তকরণকারীর দ্বিতীয় বৈধ ব্যবহার দেশী সমবয়সীদের সাথে সম্পর্কিত বিষয়গুলিকে উদ্বেগ করে। নেটিভ পিয়ার হ'ল নেটিভ অবজেক্ট, যেখানে একটি সাধারণ অবজেক্ট দেশীয় পদ্ধতিতে প্রতিনিধিত্ব করে। নেটিভ পিয়ার সাধারণ জিনিস না হওয়ায়, আবর্জনা সংগ্রহকারী এটি সম্পর্কে জানেন না এবং জাভা পিয়ারটি পুনরায় দাবি করা হলে এটি পুনরায় দাবি করতে পারবেন না। এই কাজটি সম্পাদন করার জন্য একটি চূড়ান্তরক্ষক হ'ল উপযুক্ত বাহন, ধরে নেওয়া দেশীয় পিয়ারের কাছে কোনও সমালোচনামূলক সংস্থান নেই। নেটিভ পিয়ারের যদি এমন সংস্থান থাকে যেগুলি অবশ্যই অবিলম্বে সমাপ্ত করা উচিত, তবে শ্রেণীর একটি সুস্পষ্ট সমাপ্তি পদ্ধতি থাকতে হবে, যা উপরে বর্ণিত আছে। সমাপ্তির পদ্ধতিটি সমালোচনামূলক সংস্থান মুক্ত করার জন্য যা করা উচিত তা করা উচিত।

আরও পড়ার জন্য, আইটেম 7, পৃষ্ঠা 27 দেখুন।


4
# 2 শব্দের সাথে নেটিভ পিয়ার একটি দেশীয় সম্পদ যাটির জন্য সুরক্ষা জাল দরকার এবং এটি একটি সমাপ্তির পদ্ধতি হওয়া উচিত এবং সুতরাং এটি আলাদা পয়েন্ট হওয়া উচিত নয়।
মাকিং হাঁস

2
@ মুভিংডাক: # 2 একটি পৃথক পয়েন্ট কারণ, যদি দেশীয় সহকর্মী সমালোচনামূলক সংস্থানগুলি ধরে না রাখেন (যেমন এটি নিখুঁতভাবে একটি মেমরির অবজেক্ট) তবে স্পষ্টভাবে সমাপ্তির পদ্ধতিটি প্রকাশ করার দরকার নেই। # 1 থেকে সুরক্ষা জাল একটি সমাপ্তির পদ্ধতিটি সম্পর্কে স্পষ্টভাবে।
ঝোমিনাল

55

ফাইনালাইজারগুলি দেশীয় সম্পদ পরিচালনার জন্য গুরুত্বপূর্ণ। উদাহরণস্বরূপ, আপনার অবজেক্টের অপারেটিং সিস্টেম থেকে একটি জাভা-নন এপিআই ব্যবহার করে একটি উইজেটহ্যান্ডেল বরাদ্দ করার প্রয়োজন হতে পারে। আপনি যদি সেই উইজেটহ্যান্ডলটি প্রকাশ না করেন যদি আপনার বস্তুটি GC'd হয়, আপনি উইজেটহ্যান্ডলগুলি ফাঁস হবেন।

গুরুত্বপূর্ণ বিষয়টি হ'ল "চূড়ান্তকরণকারীকে কখনই বলা হয় না" কেসগুলি কেবল ভেঙে ফেলা হয়:

  1. প্রোগ্রামটি দ্রুত বন্ধ হয়ে যায়
  2. প্রোগ্রামটির জীবদ্দশায় বস্তুটি "চিরকাল বেঁচে থাকে"
  3. কম্পিউটার বন্ধ হয়ে যায় / আপনার প্রক্রিয়াটি ওএস / ইত্যাদি দ্বারা নিহত হয়

এই তিনটি ক্ষেত্রেই আপনার হয় একটি নেটিভ ফাঁস নেই (আপনার প্রোগ্রামটি আর চলছে না এর কারণেই) বা আপনার ইতিমধ্যে একটি অ-নেটিভ ফুটো আছে (যদি আপনি তাদের পরিচালনা না করে পরিচালিত বস্তু বরাদ্দ রাখেন তবে GC'd)।

"ফাইনালাইজার বলা হচ্ছে তার উপর নির্ভর করবেন না" সতর্কতাটি আসলে প্রোগ্রাম লজিকের জন্য ফাইনালাইজার ব্যবহার না করা সম্পর্কিত। উদাহরণস্বরূপ, আপনি নির্মাণের সময় কোথাও কোনও ফাইলের কাউন্টার বাড়িয়ে এবং ফাইনালাইজারে এটি হ্রাস করে আপনার প্রোগ্রামের সমস্ত উদাহরণ জুড়ে আপনার কতগুলি অবজেক্ট রয়েছে তা ট্র্যাক রাখতে চান না - কারণ আপনার বস্তুগুলির কোনও নিশ্চয়তা নেই চূড়ান্ত করা হবে, এই ফাইলের কাউন্টারটি সম্ভবত কখনও 0 এ ফিরে যাবে না really এটি আপনার আরও সাধারণ নীতিমালার একটি বিশেষ ঘটনা যা আপনার প্রোগ্রামটি সাধারণত বন্ধ হওয়া (পাওয়ার ব্যর্থতা ইত্যাদির উপর নির্ভর করে না)।

নেটিভ রিসোর্স পরিচালনার জন্য, যদিও, ফাইনালাইজারটি চালিত না হওয়া মামলাগুলি না চালানো হয় সে ক্ষেত্রে আপনার যত্ন নেই to


দুর্দান্ত উত্তর। যদিও এটি বলা যেতে পারে আমি তার মতো ছিলাম .. এটি এখনও অন্তর্ভুক্ত করা উচিত। প্রশ্ন এবং স্ট্যাকওভারফ্লোতে সংযুক্ত একটি নিয়ে আমি কিছুক্ষণের জন্য বিভ্রান্ত হয়ে পড়েছিলাম।
অবগত

3
এটি প্রশ্নে ছিল না, তবে "চূড়ান্তকরণকারীকে ডাকা হচ্ছে তার উপর নির্ভর করবেন না" এর প্রসঙ্গে আলোচনা করা মূল্যবান: চূড়ান্তকরণকারীর নাম বলা যেতে পারে, তবে বস্তুটি অ্যাক্সেসযোগ্য হয়ে যাওয়ার পরে কেবল নির্বিচারে দীর্ঘ বিলম্বের পরে। এটি "নেটিভ রিসোর্সগুলির" জন্য যা মেমোরির চেয়ে অনেক বেশি দুর্লভ (যা তাদের বেশিরভাগের মধ্যে রয়েছে এটি সক্রিয়) for

26
"দেশীয় সম্পদ পরিচালনার জন্য ফাইনালাইজারগুলি গুরুত্বপূর্ণ" " - nooooooooo, আহম দুঃখিত। নেটিভ রিসোর্সগুলি পরিচালনা করার জন্য চূড়ান্তকরণগুলি ব্যবহার করা একটি ভয়াবহ ধারণা (যার কারণে আমরা এখন স্বতঃবীক্ষণযোগ্য এবং কো। অন্য কোনও সংস্থান নয়, জিসি কেবল স্মৃতি সম্পর্কে চিন্তা করে। এর অর্থ আপনি দেশীয় সম্পদগুলি শেষ করতে পারেন তবে এখনও জিসি ট্রিগার না করার পর্যাপ্ত মেমরি থাকতে পারে - আমরা সত্যই এটি চাই না। ফাইনালাইজাররা জিসিকে আরও ব্যয়বহুল করে তোলে যা ভাল ধারণাও নয়।
ভু

12
আমি সম্মত আপনি এখনও একটি সুনির্দিষ্ট নেটিভ সম্পদ ব্যবস্থাপনা finalizers ছাড়া অন্য কৌশল থাকা উচিত, কিন্তু আপনার বস্তুর যদি না তাদের বরাদ্দ এবং finalizer তাদের মুক্ত না করে, আপনি নিজেকে একটি নেটিভ লিক করার ক্ষেত্রে খোলার করছি যেখানে অবজেক্ট সংস্থানটি স্পষ্টভাবে বিনামূল্যে ছাড়াই GC'd। অন্য কথায়, চূড়ান্তকরণগুলি একটি স্থানীয় সম্পদ পরিচালনার কৌশলগুলির একটি গুরুত্বপূর্ণ অঙ্গ , সাধারণভাবে সমস্যার সমাধান নয়।
রায়ান কাভানহো

1
@ খুব সম্ভবত এটি বলা আরও সঠিক যে চূড়ান্তকরণকারীটি যদি অবজেক্টের চুক্তি অনুসরণ না করা হয় ( close()তবে এটি অ্যাক্সেসযোগ্য হওয়ার আগে কখনও ডাকা হয় না) বলার অপেক্ষা রাখে
রাচেট ফ্রিক

5

এই পদ্ধতিটির উদ্দেশ্য নীচে এপিআই ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে:

জাভা ভার্চুয়াল মেশিনটি যদি নির্ধারণ করে থাকে যে আর কোনও উপায় নেই যার দ্বারা এই বস্তুটি এখনও মারা যায় নি এমন কোনও থ্রেড দ্বারা অ্যাক্সেস করা যায়, অন্য কোনও বস্তুর চূড়ান্তকরণের দ্বারা গৃহীত কোনও পদক্ষেপের ফলস্বরূপ বা ক্লাস যা চূড়ান্ত হতে প্রস্তুত ...

finalize... এর সাধারণ উদ্দেশ্য হ'ল অব্যবহৃতভাবে বাতিল করার আগে ক্লিনআপ ক্রিয়া করা । উদাহরণস্বরূপ, কোনও ইনপুট / আউটপুট সংযোগ উপস্থাপন করে এমন কোনও অবজেক্টের চূড়ান্তকরণ পদ্ধতিটি স্থায়ীভাবে বাতিল করার আগে এই সংযোগটি ভাঙ্গার জন্য সুস্পষ্ট I / O লেনদেন সম্পাদন করতে পারে ...


যদি আপনি অতিরিক্তভাবে ভাষা ডিজাইনারদের কেন বেছে নিয়েছেন যে "বস্তুটি অকাট্যভাবে বাতিল করা হয়" ( আবর্জনা সংগ্রহ করা ) যেভাবে অ্যাপ্লিকেশন প্রোগ্রামার নিয়ন্ত্রণের বাইরে ("আমাদের কখনই নির্ভর করা উচিত নয়)" বেছে নেওয়া হয়েছে, সে সম্পর্কিত একটি উত্তরে এটি ব্যাখ্যা করা হয়েছে প্রশ্ন :

স্বয়ংক্রিয় আবর্জনা সংগ্রহ ... প্রোগ্রামিং ত্রুটিগুলির পুরো ক্লাসগুলি সরিয়ে দেয় যা সি এবং সি ++ প্রোগ্রামারদের বিভাইড করে। আপনি জাভা কোডটি আত্মবিশ্বাসের সাথে বিকাশ করতে পারেন যে সিস্টেমটি অনেকগুলি ত্রুটি দ্রুত খুঁজে পাবে এবং আপনার উত্পাদন কোডটি প্রেরণ না হওয়া অবধি বড় সমস্যাগুলি সুপ্ত হবে না ..

পরিবর্তে, জাভা ডিজাইনের লক্ষ্যগুলি সম্পর্কে সরকারী দস্তাবেজ থেকে নেওয়া হয়েছিল , এই কারণেই জাভা ভাষার ডিজাইনাররা কেন এইভাবে সিদ্ধান্ত নিয়েছিল তা ব্যাখ্যা করে এটি অনুমোদনযোগ্য রেফারেন্স হিসাবে বিবেচনা করা যেতে পারে।

এই পছন্দটির আরও বিশদ এবং ভাষা অজ্ঞাব্য আলোচনার জন্য, ওওএসসি বিভাগ 9.6 দেখুন স্বয়ংক্রিয় মেমরি পরিচালনা (আসলে, আপনি কেবল এই বিভাগে আগ্রহী না হন তবে এই বিভাগটিই নয় তবে পুরো অধ্যায়টি 9 পড়ার পক্ষে খুব মূল্যবান)। এই বিভাগটি একটি দ্ব্যর্থহীন বিবৃতি দিয়ে খোলে:

একটি ভাল ওও পরিবেশের এমন একটি স্বয়ংক্রিয় মেমরি পরিচালনার ব্যবস্থা করা উচিত যা অ্যাক্সেসযোগ্য অবজেক্টগুলিকে সনাক্ত এবং পুনরায় দাবি জানাতে সক্ষম হবে, অ্যাপ্লিকেশন বিকাশকারীদের তাদের কাজ - অ্যাপ্লিকেশন বিকাশে মনোনিবেশ করার অনুমতি দেবে।

পূর্ববর্তী আলোচনার পর্যায়ে এ জাতীয় সুবিধাগুলি পাওয়া কতটা জরুরি তা বোঝাতে যথেষ্ট হবে। মাইকেল শোয়েইজার এবং ল্যামবার্ট স্ট্রেথারের ভাষায়:

স্বয়ংক্রিয় মেমরি পরিচালনা ছাড়াই কোনও অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামটি সেফটি ভালভ ছাড়াই মোটামুটি একটি প্রেসার কুকারের মতো: শীঘ্রই বা পরে জিনিসটি ফুটিয়ে তোলা নিশ্চিত!


4

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


3

কভ্যাট: আমি হয়তো পুরানো হয়ে গেছি, তবে কয়েক বছর আগের মত এটি আমার বোঝার বিষয়:

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

এবং কিছু জিসি চূড়ান্তভাবে জিসি'র বস্তুগুলিকে চূড়ান্তভাবে বিলম্বিত করতে বা এড়ানোর জন্য পরিচিত ছিল যা চূড়ান্তকরণকারী ছিল, এই আশায় যে এটি বেঞ্চমার্কগুলিতে আরও ভাল পারফরম্যান্স তৈরি করতে পারে।

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

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


1

গুগল জাভা স্টাইল গাইড বিষয়ে কিছু ঋষি পরামর্শ আছে:

ওভাররাইড করা এটি অত্যন্ত বিরলObject.finalize

টিপ : এটি করবেন না। যদি আপনার অবশ্যই আবশ্যক, প্রথমে কার্যকর জাভা আইটেম 7 টি পড়ুন এবং বুঝতে হবে "ফাইনালাইজারদের এড়ান," খুব সাবধানতার সাথে এবং তারপরে এটি করবেন না।


5
কেন আমি সমস্যার ওভারসিম্লিফিকেশনকে প্রশংসা করি, "এটি করবেন না" "কেন এটি বিদ্যমান" এর কোনও উত্তর নয়।
পিয়েরে আরলাড

1
আমি অনুমান করি যে আমি আমার উত্তরে এটি ভালভাবে বানান করি নি, তবে (আইএমও) "কেন এটি বিদ্যমান?" "এটি করা উচিত নয়"। এই বিরল ক্ষেত্রে যেখানে আপনার সত্যিকার অর্থে চূড়ান্তকরণ অপারেশন প্রয়োজন, আপনি সম্ভবত এটির পরিবর্তে PhantomReferenceএবং এর ReferenceQueueপরিবর্তে নিজেরাই এটি তৈরি করতে চান ।
ড্যানিয়েল প্রাইডেন

আমি বোঝাতে চাইছিলাম * যদিও আমি আপনাকে নিম্মত করি নি। সর্বাধিক উত্সাহিত উত্তরটি পদ্ধতিটি কতটা কার্যকর তা দেখায়, কিন্ত আপনার পয়েন্টটি অকার্যকর করে তুলবে।
পিয়েরে আরলাড

1
এমনকি দেশীয় পিয়ারের ক্ষেত্রেও আমি মনে করি PhantomReferenceএটি আরও ভাল সমাধান। ফাইনালাইজাররা জাভা শুরুর দিনগুলি থেকে ছেড়ে আসা একটি মশালাকে পছন্দ করে Object.clone()এবং কাঁচা ধরণের ভাষা ভুলে যাওয়া ভাষার একটি অংশ।
ড্যানিয়েল প্রাইডেন

1
চূড়ান্তকরণকারীদের বিপদগুলি সি # তে আরও অ্যাক্সেসযোগ্য (বিকাশকারীদের দ্বারা বোধগম্য) পদ্ধতিতে বর্ণনা করা হয়েছে। , যদিও, কেউ অবশ্যই বোঝায় না যে জাভা এবং সি # তে অন্তর্নিহিত পদ্ধতিগুলি একই; তাদের স্পেসিফিকেশনে এমন কিছু নেই যা বলে say
রাওয়ং

1

জাভা ভাষা স্পেসিফিকেসন (জাভা SE 7) বলে:

ফাইনালাইজাররা এমন সংস্থানগুলি মুক্ত করার সুযোগ দেয় যা কোনও স্বয়ংক্রিয় স্টোরেজ ম্যানেজার দ্বারা স্বয়ংক্রিয়ভাবে মুক্তি দেওয়া যায় না। এই ধরনের পরিস্থিতিতে, কেবল কোনও বস্তুর দ্বারা ব্যবহৃত স্মৃতি পুনরুদ্ধার করা গ্যারান্টি দেয় না যে এটি যে সংস্থানগুলি রেখেছিল তা পুনরায় আদায় করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.