यदि क्लास आंतरिक रूप से एक या अधिक संसाधनों पर निर्भर करती है, और वे संसाधन क्लास के व्यवहार को प्रभावित करते हैं, तो सिंगलटन और स्टेटिक उपयोगिता क्लास का उपयोग नहीं करना सबसे अच्छा है।
इन संसाधनों को क्लास द्वारा सीधे बनाने की अनुमति नहीं होनी चाहिए, बल्कि कंस्ट्रक्टर को आवश्यक संसाधन प्रदान करना चाहिए। निर्भरता इंजेक्शन के माध्यम से, क्लास की लचीलापन, पुन: प्रयोज्यता और परीक्षण योग्यता में सुधार किया जा सकता है।
उदाहरण
स्टेटिक उपयोगिता क्लास का उपयोग करके उदाहरण
```javascript public class SpellChecker {
}
यह उपयोगिता क्लास मानती है कि केवल एक शब्दकोश का उपयोग किया जाएगा। हालांकि, वास्तविकता में, शब्दकोश भाषा के आधार पर अलग-अलग होते हैं, और यहां तक कि विशिष्ट शब्दावली के लिए अलग शब्दकोश भी होते हैं।
सिंगलटन क्लास का उपयोग करके उदाहरण
```javascript public class SpellChecker {
}
सिंगलटन क्लास भी मानती है कि केवल एक शब्दकोश का उपयोग किया जाएगा, इसलिए उपरोक्त समान नुकसान होता है।
समाधान 1 - फील्ड से final कीवर्ड को हटा दें।
```javascript public class SpellChecker {
}
स्टेटिक उपयोगिता क्लास या सिंगलटन क्लास के शब्दकोश के लिए final कीवर्ड को हटाकर, इसे बाहरी रूप से एक अलग शब्दकोश में बदलने के लिए डिज़ाइन किया जा सकता है। हालांकि, यह विधि उपयोग करना भारी है, और मल्टीथ्रेडेड वातावरण में, यह समवर्ती समस्याओं का कारण बन सकता है।
समाधान 2 - निर्भरता इंजेक्शन का उपयोग करें।
```javascript public class SpellChecker {
}
ऊपर दिए गए उदाहरण से, हम यह देख सकते हैं कि स्टेटिक क्लास और सिंगलटन क्लास को आंतरिक संसाधनों पर निर्भर नहीं होना चाहिए। दूसरे शब्दों में, आंतरिक संसाधन बाहरी रूप से इंजेक्ट किए जाने चाहिए।
निर्भरता इंजेक्शन का उपयोग करने वाली क्लास final कीवर्ड के कारण अपरिवर्तनीयता की गारंटी दे सकती है, और कई संसाधन उदाहरणों का समर्थन कर सकती है। इसके अतिरिक्त, निर्भरता इंजेक्शन का उपयोग कंस्ट्रक्टर के साथ-साथ स्टेटिक फैक्ट्री और बिल्डर में भी किया जा सकता है।
निर्भरता इंजेक्शन में संसाधन को सीधे पास करने का एक सरल तरीका है, लेकिन फैक्ट्री को पास करने का तरीका अक्सर उपयोग किया जाता है। एक फैक्ट्री एक ऐसी वस्तु है जो कॉल होने पर एक विशिष्ट प्रकार के उदाहरण को बार-बार बनाती है। यह विधि फैक्टरी मेथड पैटर्न कहलाती है, और जावा 8 में Supplier<T> एक फैक्ट्री का एकदम सही उदाहरण है।
```javascript
public static List
फैक्ट्री के प्रकार पैरामीटर को सीमित करने के लिए अक्सर सीमित वाइल्डकार्ड प्रकार का उपयोग किया जाता है। इस विधि का उपयोग करके, क्लाइंट फैक्ट्री को अपनी घोषित प्रकार की कोई भी उप-प्रकार पास कर सकता है।
निर्भरता इंजेक्शन लचीलापन और परीक्षण योग्यता में सुधार करता है, लेकिन निर्भरता-भारी परियोजनाओं के लिए यह काफी महंगा हो सकता है। ऐसे मामलों में, निर्भरता इंजेक्शन ढाँचे (डैगर, गुइस, स्प्रिंग, आदि) का उपयोग लागत को कम करने के लिए किया जा सकता है।
टिप्पणियाँ0