আপনার নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে, কিছু ক্ষেত্রে জাভার পরিষেবা লোডার প্রক্রিয়া আপনার পরে যা অর্জন করতে পারে।
সংক্ষেপে, এটি বিকাশকারীদের স্পষ্টভাবে ঘোষণা করতে দেয় যে একটি শ্রেণি সাব-ক্লাস করে কিছু অন্যান্য শ্রেণি (বা কিছু ইন্টারফেস প্রয়োগ করে) JAR / WAR ফাইল META-INF/servicesডিরেক্টরিতে একটি ফাইলে তালিকাভুক্ত করে । এরপরে java.util.ServiceLoaderশ্রেণীর সাহায্যে এটি আবিষ্কার করা যেতে পারে যা কোনও Classবস্তু দেওয়া হলে class শ্রেণীর সমস্ত ঘোষিত সাবক্লাসগুলির উদাহরণ তৈরি করে (বা, যদি Classকোনও ইন্টারফেস প্রতিনিধিত্ব করে, সেই ইন্টারফেসটি বাস্তবায়নকারী সমস্ত শ্রেণীর)।
এই পদ্ধতির মূল সুবিধাটি হ'ল সাবক্লাসের জন্য পুরো ক্লাসপাথটি ম্যানুয়ালি স্ক্যান করার দরকার নেই - সমস্ত আবিষ্কার যুক্তি ServiceLoaderক্লাসের মধ্যে রয়েছে এবং এটি কেবল META-INF/servicesডিরেক্টরিতে স্পষ্টভাবে ঘোষিত ক্লাসগুলি লোড করে (শ্রেণিপথের প্রতিটি শ্রেণি নয়) ।
তবে এর কিছু অসুবিধাও রয়েছে:
- এটি সব খুঁজে পাবেন না উপশ্রেণীর , কেবলমাত্র যা স্পষ্টভাবে ঘোষণা করা হয়েছে। যেমন, আপনার যদি সত্যই সমস্ত উপক্লাগুলি সন্ধান করার প্রয়োজন হয় তবে এই পদ্ধতিটি অপর্যাপ্ত হতে পারে।
- এটি বিকাশকারীকে নির্দেশের অধীনে ক্লাসটি স্পষ্টভাবে ঘোষণা করার প্রয়োজন
META-INF/services। এটি বিকাশকারীদের উপর অতিরিক্ত বোঝা এবং ত্রুটি-প্রবণ হতে পারে।
ServiceLoader.iterator()উপশ্রেণী দৃষ্টান্ত, তাদের উত্পন্ন Classবস্তু। এটি দুটি সমস্যার কারণ:
- সাবক্লাসগুলি কীভাবে তৈরি করা হয় সে সম্পর্কে আপনি কোনও বক্তব্য পান না - উদাহরণগুলি তৈরি করতে নো-আরগ কনস্ট্রাক্টর ব্যবহার করা হয়।
- এর মতো, সাবক্লাসগুলির অবশ্যই একটি ডিফল্ট কনস্ট্রাক্টর থাকতে হবে, বা অবশ্যই কোনও নো-আরগ কনস্ট্রাক্টর ঘোষণা করতে হবে।
স্পষ্টতই জাভা 9 এই কয়েকটি ত্রুটিগুলিকে সম্বোধন করবে (বিশেষত সাবক্লাসগুলির ইনস্ট্যান্টেশন সম্পর্কিত বিষয়গুলি)।
একটি উদাহরণ
ধরুন আপনি ইন্টারফেস প্রয়োগকারী ক্লাসগুলি সন্ধান করতে আগ্রহী com.example.Example:
package com.example;
public interface Example {
public String getStr();
}
শ্রেণীটি com.example.ExampleImplইন্টারফেস প্রয়োগ করে:
package com.example;
public class ExampleImpl implements Example {
public String getStr() {
return "ExampleImpl's string.";
}
}
আপনি ঘোষণা করা হবে বর্গ ExampleImplএকটি বাস্তবায়ন Exampleএকটি ফাইল তৈরি করে META-INF/services/com.example.Exampleপাঠ্য ধারণকারী com.example.ExampleImpl।
তারপরে, আপনি প্রতিটি প্রয়োগের উদাহরণ পেতে পারেন Example(উদাহরণ সহ ExampleImpl) নিম্নরূপ:
ServiceLoader<Example> loader = ServiceLoader.load(Example.class)
for (Example example : loader) {
System.out.println(example.getStr());
}
// Prints "ExampleImpl's string.", plus whatever is returned
// by other declared implementations of com.example.Example.