আপনি স্পষ্টতই ইতিমধ্যে উদ্দীপিত হয়ে গেছেন, হ্যাঁ, সি ++ সেই প্রক্রিয়া ছাড়াই একই ক্ষমতা সরবরাহ করে। যেমন, কঠোরভাবে বলতে গেলে, try/ finallyপ্রক্রিয়াটি আসলেই প্রয়োজনীয় নয়।
এটি বলেছিল, এটি না করে কাজটি বাকী ভাষার নকশা করার পদ্ধতিতে কিছু প্রয়োজনীয়তা আরোপ করে। সি ++ তে একই সংস্থার ক্রিয়াকলাপ একটি শ্রেণীর 'ডেস্ট্রাক্টর'-এ মূর্ত থাকে। এটি মূলত (একচেটিয়া?) কাজ করে কারণ C ++ এ ডেস্ট্রাক্টর আহ্বান হ'ল ডিটারমিনিস্টিক। ফলস্বরূপ, এটি অবজেক্টের লাইফটাইম সম্পর্কে কিছু জটিল নিয়মের দিকে পরিচালিত করে, যার কয়েকটি স্থির অ-স্বজ্ঞাত।
অন্যান্য ভাষাগুলির বেশিরভাগ পরিবর্তে কিছু ফর্ম জঞ্জাল সংগ্রহ করে। যদিও আবর্জনা সংগ্রহের বিষয়ে বিতর্কিত কিছু রয়েছে (যেমন, স্মৃতি পরিচালনার অন্যান্য পদ্ধতির তুলনায় এর দক্ষতা) একটি জিনিস সাধারণত হয় না: আবর্জনা সংগ্রহকারী দ্বারা কোনও জিনিস "পরিষ্কার" করার সঠিক সময়টি সরাসরি বাঁধা থাকে না অবজেক্টের সুযোগে। এটি যখন সঠিকভাবে পরিচালনার জন্য প্রয়োজন হয় যখন ক্লিনআপকে নির্বিচারে করা দরকার হয় বা যখন এতই মূল্যবান সংস্থান দিয়ে কাজ করা হয় যে সেগুলির পরিষ্কার-পরিচ্ছন্নতা নির্বিচারে বিলম্বিত না হয় তখন এটি তার ব্যবহারকে বাধা দেয়। try/ এই finallyজাতীয় ভাষার জন্য সেই পরিস্থিতিগুলির সাথে মোকাবিলা করার জন্য একটি উপায় সরবরাহ করে যার জন্য প্রয়োজন যে নির্বিচারে ক্লিনআপ।
আমি মনে করি যে এই সামর্থ্যের জন্য সি ++ সিনট্যাক্স দাবি করছেন তারা জাভা এর চেয়ে "কম বন্ধুত্বপূর্ণ" বোধ করছেন তবে তারা বিন্দুটি অনুপস্থিত। সবচেয়ে খারাপ বিষয়, তারা দায়বদ্ধতার বিভাজন সম্পর্কে আরও অনেক গুরুত্বপূর্ণ বিষয়টি হারিয়ে যাচ্ছে যা সিনট্যাক্সের চেয়ে অনেক বেশি এগিয়ে গেছে এবং কোডটি কীভাবে ডিজাইন করা হয়েছে তার সাথে আরও অনেক কিছু করার রয়েছে।
সি ++ তে, এই নির্বিচারক ক্লিনআপটি অবজেক্টের ডেস্ট্রাক্টরে ঘটে। এর অর্থ এটি নিজের থেকে পরিষ্কার করার জন্য অবজেক্টটি (এবং সাধারণত হওয়া উচিত) তৈরি করা যেতে পারে। এটি অবজেক্ট অরিয়েন্টেড ডিজাইনের সারমর্মের দিকে যায় - কোনও শ্রেণি একটি বিমূর্ততা সরবরাহ করার জন্য তৈরি করা উচিত এবং তার নিজস্ব আক্রমণকারীদের প্রয়োগ করতে হবে। সি ++-তে, একটি সুনির্দিষ্টভাবে এটি করে - এবং এটি যে আক্রমণকারীদের জন্য সরবরাহ করে তাদের মধ্যে একটি হ'ল যখন বস্তুটি ধ্বংস হয়ে যায় তখন object বস্তুর দ্বারা নিয়ন্ত্রিত সংস্থানগুলি (তাদের সমস্ত কিছুই কেবল স্মৃতি নয়) সঠিকভাবে ধ্বংস হয়ে যায়।
জাভা (এবং অনুরূপ) কিছুটা আলাদা। তারা (বাছাই করা) finalizeএমন কোনও সমর্থনকে সমর্থন করে যা তাত্ত্বিকভাবে অনুরূপ ক্ষমতা প্রদান করতে পারে, সমর্থনটি এতটাই দুর্বল যে এটি মূলত অব্যবহারযোগ্য (এবং বাস্তবে, মূলত কখনই ব্যবহৃত হয় না)।
ফলস্বরূপ, ক্লাস নিজেই প্রয়োজনীয় ক্লিনআপ করতে সক্ষম হওয়ার পরিবর্তে ক্লাসের ক্লায়েন্টকে এটি করার জন্য পদক্ষেপ নেওয়া উচিত। যদি আমরা পর্যাপ্ত স্বল্পদৃষ্টির তুলনা করি তবে এটি প্রথম নজরে উপস্থিত হতে পারে যে এই পার্থক্যটি মোটামুটি সামান্য এবং জাভা এই ক্ষেত্রে সি ++ এর সাথে বেশ প্রতিযোগিতামূলক। আমরা এই জাতীয় কিছু দিয়ে শেষ করি। সি ++ তে, শ্রেণিটি দেখতে এমন কিছু দেখাচ্ছে:
class Foo {
// ...
public:
void do_whatever() { if (xyz) throw something; }
~Foo() { /* handle cleanup */ }
};
... এবং ক্লায়েন্ট কোডটি দেখতে এরকম কিছু দেখাচ্ছে:
void f() {
Foo f;
f.do_whatever();
// possibly more code that might throw here
}
জাভাতে আমরা আরও কিছু কোড আদান-প্রদান করি যেখানে ক্লাসে কিছুটা কম ব্যবহৃত হয় object এটি প্রথমদিকে দেখতে বেশ সুন্দর এমনকি বাণিজ্য বন্ধ বলে মনে হচ্ছে। বাস্তবে, এটি যদিও এটি থেকে অনেক দূরে, কারণ বেশিরভাগ সাধারণ কোডে আমরা কেবলমাত্র এক জায়গায় ক্লাসটি সংজ্ঞায়িত করি , তবে আমরা এটি অনেক জায়গায় ব্যবহার করি। সি ++ পদ্ধতির অর্থ আমরা কেবল একটি জায়গায় ক্লিনআপ পরিচালনা করতে সেই কোডটি লিখি। জাভা পদ্ধতির অর্থ হল ক্লিনআপটি অনেকবার, অনেক জায়গায় - হ্যান্ডেল করার জন্য আমাদের সেই কোডটি লিখতে হবে - প্রতিটি জায়গাতেই আমরা class শ্রেণির কোনও অবজেক্ট ব্যবহার করি।
সংক্ষেপে, জাভা পদ্ধতির মূলত গ্যারান্টি দেয় যে আমরা যে বিমূর্ততা সরবরাহ করার চেষ্টা করি তা হ'ল "ফাঁস" - যে কোনও এবং প্রতিটি শ্রেণীর জন্য যে ডিস্ট্রিমেন্টিক ক্লিনআপ প্রয়োজন ক্লাসের ক্লায়েন্টকে কী ক্লিনআপ করবেন এবং ক্লিনআপ কীভাবে করবেন তার বিশদ সম্পর্কে জানতে বাধ্য হয় class পরিবর্তে ক্লাসে এই বিবরণ লুকানো হচ্ছে।
যদিও আমি এটিকে উপরে "জাভা পদ্ধতির" বলেছি, try/ finallyএবং অন্যান্য নামের অনুরূপ প্রক্রিয়া পুরোপুরি জাভাতেই সীমাবদ্ধ নয়। একটি বিশিষ্ট উদাহরণের জন্য, .NET ভাষাগুলির বেশিরভাগ (সমস্ত?) (যেমন, সি #) একই সরবরাহ করে।
জাভা এবং সি # উভয়ের সাম্প্রতিক পুনরাবৃত্তিগুলি এই ক্ষেত্রে "ক্লাসিক" জাভা এবং সি ++ এর মধ্যে অর্ধপথের কিছু দেয়। সি # তে, এমন কোনও বস্তু যা তার ক্লিনআপটি স্বয়ংক্রিয় করতে চায় IDisposableইন্টারফেসটি প্রয়োগ করতে পারে , যা একটি Disposeপদ্ধতি প্রদান করে যা (অন্তত অস্পষ্টভাবে) সি ++ ডিস্ট্রাক্টরের অনুরূপ। এই যখন করতে একটি মাধ্যমে ব্যবহার করা যেতে try/ finallyজাভা মত, সি # টাস্কের একটি স্বয়ংক্রিয়রূপে সামান্য একটি সঙ্গে আরো usingএ বক্তব্যে আপনি কি সম্পদ হিসাবে একটি সুযোগ প্রবেশ করানো হয় তৈরি করা হবে, এবং ধ্বংস যখন সুযোগ থেকে প্রস্থান করা হয় সংজ্ঞায়িত করতে দেয়। সি ++ দ্বারা সরবরাহিত অটোমেশন এবং নিশ্চিতকরণের স্তরের তুলনায় এখনও কম, তবে এটি এখনও জাভার তুলনায় যথেষ্ট উন্নতি। বিশেষত, ক্লাস ডিজাইনার কীভাবে তার বিশদটি কেন্দ্রিয় করতে পারেনএর বাস্তবায়নে শ্রেণিকে নিষ্পত্তি করা IDisposable। ক্লায়েন্ট প্রোগ্রামারের জন্য যা অবশিষ্ট রয়েছে তা হ'ল একটি usingবিবৃতি লেখার কম বোঝা হ'ল IDisposableইন্টারফেসটি কখন হওয়া উচিত তা নিশ্চিত করা যায়। জাভা 7 এবং আরও নতুনতে, দোষীদের সুরক্ষার জন্য নামগুলি পরিবর্তন করা হয়েছে, তবে মূল ধারণাটি মূলত অভিন্ন।