आपकी विशेष आवश्यकताओं के आधार पर, कुछ मामलों में जावा के सेवा लोडर तंत्र को प्राप्त हो सकता है।
संक्षेप में, यह डेवलपर्स को स्पष्ट रूप से यह घोषणा करने की अनुमति देता है कि एक वर्ग 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
कार्यान्वयन है ।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.