জাভা 8 স্থিতিশীল ইন্টারফেস পদ্ধতির অনুমতি দেয়
জাভা 8 সঙ্গে, ইন্টারফেসগুলি করতে স্ট্যাটিক পদ্ধতি আছে। তাদের কাছে কংক্রিট উদাহরণ পদ্ধতি থাকতে পারে তবে উদাহরণ ক্ষেত্রগুলি নয়।
এখানে সত্যিই দুটি প্রশ্ন আছে:
- কেন, খারাপ পুরানো সময়ে, ইন্টারফেসগুলিতে স্থির পদ্ধতি থাকতে পারে না?
- স্থির পদ্ধতিগুলি কেন ওভাররাইড করা যায় না?
ইন্টারফেসে স্থির পদ্ধতি
পূর্ববর্তী সংস্করণগুলিতে ইন্টারফেসের স্থির পদ্ধতি থাকতে পারে না এমন কোনও শক্ত প্রযুক্তিগত কারণ ছিল না। এটি একটি সদৃশ প্রশ্নের পোস্টার দ্বারা সুন্দরভাবে সংক্ষিপ্ত করা হয়েছে । স্ট্যাটিক ইন্টারফেস পদ্ধতিগুলিকে প্রথমে একটি ছোট ভাষা পরিবর্তন হিসাবে বিবেচনা করা হত এবং এর পরে তাদের জাভা Java এ যুক্ত করার আনুষ্ঠানিক প্রস্তাব ছিল, কিন্তু পরে অপ্রত্যাশিত জটিলতার কারণে তা বাদ দেওয়া হয়েছিল ।
অবশেষে, জাভা 8 স্ট্যাটিক ইন্টারফেস পদ্ধতিগুলির পাশাপাশি একটি ডিফল্ট বাস্তবায়ন সহ ওভাররাইড-সক্ষম উদাহরণ পদ্ধতিগুলি প্রবর্তন করেছে। তাদের এখনও উদাহরণ ক্ষেত্র থাকতে পারে না। এই বৈশিষ্ট্যগুলি ল্যাম্বডা এক্সপ্রেশন সমর্থনের একটি অংশ এবং আপনি জেএসআর 335 এর পার্ট এইচ এগুলি সম্পর্কে আরও পড়তে পারেন ।
স্থির পদ্ধতিগুলি ওভাররাইড করা
দ্বিতীয় প্রশ্নের উত্তর কিছুটা জটিল।
স্থির পদ্ধতিগুলি সংকলনের সময়ে সমাধানযোগ্য। গতিশীল প্রেরণ উদাহরণের পদ্ধতিগুলির জন্য অর্থবোধ করে, যেখানে সংকলকটি বস্তুর কংক্রিটের ধরণ নির্ধারণ করতে পারে না এবং এইভাবে, অনুরোধ করার পদ্ধতিটি সমাধান করতে পারে না। তবে একটি স্ট্যাটিক পদ্ধতিতে প্রার্থনা করার জন্য একটি শ্রেণি প্রয়োজন, এবং যেহেতু সেই শ্রেণিটি স্ট্যাটিকভাবে পরিচিত হয় - এটি সংকলনের সময় — গতিশীল প্রেরণ অপ্রয়োজনীয়।
এখানে কী চলছে তা বোঝার জন্য উদাহরণ পদ্ধতিগুলি কীভাবে কাজ করে তার একটি সামান্য ব্যাকগ্রাউন্ড। আমি নিশ্চিত যে প্রকৃত বাস্তবায়ন একেবারেই আলাদা, তবে আমাকে আমার পদ্ধতি প্রেরণের ধারণাটি ব্যাখ্যা করতে দাও, যা মডেলরা আচরণটি নির্ভুলভাবে পর্যবেক্ষণ করেছেন।
ভান করুন যে প্রতিটি শ্রেণীর একটি হ্যাশ টেবিল রয়েছে যা পদ্ধতিটি বাস্তবায়নের জন্য পদ্ধতিটির স্বাক্ষরগুলি (নাম এবং প্যারামিটার ধরণের) মানচিত্র দেয় implement ভার্চুয়াল মেশিন কোনও উদাহরণে কোনও পদ্ধতি চালিত করার চেষ্টা করলে, এটি তার শ্রেণীর জন্য অবজেক্টটি অনুসন্ধান করে এবং শ্রেণীর সারণীতে অনুরোধিত স্বাক্ষরটি সন্ধান করে। যদি কোনও মেথড বডি পাওয়া যায়, তবে এটি চাওয়া হয়। অন্যথায়, ক্লাসের পিতামাত্ত শ্রেণি প্রাপ্ত হয় এবং সেখানে লুকিং পুনরাবৃত্তি হয়। পদ্ধতিটি সন্ধান না হওয়া অবধি এই প্রক্রিয়াটি এগিয়ে যায়, বা এর চেয়ে বেশি কোনও প্যারেন্ট ক্লাস নেই — যার ফলস্বরূপ এ NoSuchMethodError
।
যদি একটি সুপারক্লাস এবং একটি সাবক্লাস উভয়েরই একই পদ্ধতির স্বাক্ষরের জন্য তাদের টেবিলগুলিতে প্রবেশ করে, সাব ক্লাসের সংস্করণটি প্রথমে মুখোমুখি হয় এবং সুপারক্লাসের সংস্করণটি কখনও ব্যবহৃত হয় না — এটি একটি "ওভাররাইড"।
এখন, ধরুন আমরা বস্তুর উদাহরণটি এড়িয়ে চলেছি এবং কেবল একটি সাবক্লাস দিয়ে শুরু করব। প্রস্তাবটি উপরের মতই এগিয়ে যেতে পারে, আপনাকে এক ধরণের "ওভাররিডেবল" স্থিতিশীল পদ্ধতি দেয়। সংকলনটি সমস্তই সংকলন-সময়ে ঘটতে পারে, যেহেতু সংকলকটি তার শ্রেণীর জন্য কোনও অনির্ধারিত ধরণের কোনও অবজেক্টের অনুসন্ধানের জন্য রানটাইম অপেক্ষা না করে বরং একটি পরিচিত শ্রেণি থেকে শুরু করে। স্থির পদ্ধতিটিকে "ওভাররাইডিং" করার কোনও অর্থ নেই কারণ যে কোনও ব্যক্তি সর্বদা পছন্দসই সংস্করণ সম্বলিত শ্রেণি নির্দিষ্ট করতে পারে।
নির্মাণকারী "ইন্টারফেস"
প্রশ্নের সাম্প্রতিক সম্পাদনাটি সম্বোধন করার জন্য এখানে আরও কিছু উপাদান রয়েছে।
দেখে মনে হচ্ছে আপনি প্রতিটি প্রয়োগের জন্য কোনও নির্মাণকারীর মতো পদ্ধতি কার্যকরভাবে আদেশ করতে চান IXMLizable
। এক মিনিটের জন্য ইন্টারফেসের মাধ্যমে এটি প্রয়োগের চেষ্টা করার কথা ভুলে যান এবং ভান করুন যে আপনার এমন কিছু ক্লাস রয়েছে যা এই প্রয়োজনীয়তাটি পূরণ করে। কিভাবে আপনি এটি ব্যবহার করেন?
class Foo implements IXMLizable<Foo> {
public static Foo newInstanceFromXML(Element e) { ... }
}
Foo obj = Foo.newInstanceFromXML(e);
যেহেতু Foo
নতুন অবজেক্টটি "নির্মাণ" করার সময় আপনাকে স্পষ্টভাবে কংক্রিটের নামকরণ করতে হবে , তাই সংকলকটি যাচাই করতে পারে যে এটিতে প্রয়োজনীয় কারখানার পদ্ধতি রয়েছে। এবং যদি এটি না হয়, তাই কি? আমি একজন বাস্তবায়ন করতে পারেন IXMLizable
যে, "কনস্ট্রাকটর" অভাব আছে, এবং আমি একটি দৃষ্টান্ত তৈরি করুন এবং আপনার কোড তা পাস, এটা হল একটি IXMLizable
প্রয়োজনীয় সকল ইন্টারফেসের সাথে।
নির্মাণ বাস্তবায়ন অংশ, ইন্টারফেস নয়। ইন্টারফেসের সাথে সাফল্যের সাথে কাজ করে এমন কোনও কোড কনস্ট্রাক্টরকে পাত্তা দেয় না। যে কোনও কোড যা কনস্ট্রাক্টরকে যত্ন করে তা কোনওভাবেই কংক্রিটের প্রকারটি জানতে হবে এবং ইন্টারফেসটিকে উপেক্ষা করা যেতে পারে।