आपकी विशेष आवश्यकताओं के आधार पर, कुछ मामलों में जावा के सेवा लोडर तंत्र को प्राप्त हो सकता है।
संक्षेप में, यह डेवलपर्स को स्पष्ट रूप से यह घोषणा करने की अनुमति देता है कि एक वर्ग JAR / WAR फ़ाइल की META-INF/servicesनिर्देशिका में किसी फ़ाइल में सूचीबद्ध करके किसी अन्य वर्ग (या कुछ इंटरफ़ेस को लागू करता है) को उपवर्गित करता है । यह तब java.util.ServiceLoaderवर्ग का उपयोग करके खोजा जा सकता है , जब कोई 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कार्यान्वयन है ।ExampleMETA-INF/services/com.example.Examplecom.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.