![translation](https://cdn.durumis.com/common/trans.png)
यह एक AI अनुवादित पोस्ट है।
भाषा चुनें
durumis AI द्वारा संक्षेपित पाठ
- यदि कोई वर्ग आंतरिक रूप से एक से अधिक संसाधनों पर निर्भर करता है, तो सिंगलटन और स्टैटिक उपयोगिता वर्गों का उपयोग करना अच्छा नहीं है, इसके बजाय कंस्ट्रक्टर में आवश्यक संसाधन पास करने वाले डिपेंडेंसी इंजेक्शन का उपयोग करना उचित है।
- डिपेंडेंसी इंजेक्शन वर्ग के लचीलेपन, पुन: उपयोग, परीक्षण क्षमता में सुधार करता है, कई संसाधन उदाहरणों का समर्थन करता है, final कीवर्ड के माध्यम से अपरिवर्तनशीलता की गारंटी देता है।
- हालांकि, बहुत अधिक निर्भरताओं वाले प्रोजेक्ट में, लागत कम करने के लिए डिपेंडेंसी इंजेक्शन फ्रेमवर्क (डैगर, गूइसे, स्प्रिंग आदि) का उपयोग किया जा सकता है।
यदि क्लास आंतरिक रूप से एक या अधिक संसाधनों पर निर्भर करती है, और वे संसाधन क्लास के व्यवहार को प्रभावित करते हैं, तो सिंगलटन और स्टेटिक उपयोगिता क्लास का उपयोग नहीं करना सबसे अच्छा है।
इन संसाधनों को क्लास द्वारा सीधे बनाने की अनुमति नहीं होनी चाहिए, बल्कि कंस्ट्रक्टर को आवश्यक संसाधन प्रदान करना चाहिए। निर्भरता इंजेक्शन के माध्यम से, क्लास की लचीलापन, पुन: प्रयोज्यता और परीक्षण योग्यता में सुधार किया जा सकता है।
उदाहरण
स्टेटिक उपयोगिता क्लास का उपयोग करके उदाहरण
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {
}
public static boolean isValid(String word) {
// dictionary का उपयोग करके लॉजिक
}
public static List suggestions(String typo) {
// dictionary का उपयोग करके लॉजिक
}
यह उपयोगिता क्लास मानती है कि केवल एक शब्दकोश का उपयोग किया जाएगा। हालांकि, वास्तविकता में, शब्दकोश भाषा के आधार पर अलग-अलग होते हैं, और यहां तक कि विशिष्ट शब्दावली के लिए अलग शब्दकोश भी होते हैं।
सिंगलटन क्लास का उपयोग करके उदाहरण
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static boolean isValid(String word) {
// dictionary का उपयोग करके लॉजिक
}
public static List suggestions(String typo) {
// dictionary का उपयोग करके लॉजिक
}
सिंगलटन क्लास भी मानती है कि केवल एक शब्दकोश का उपयोग किया जाएगा, इसलिए उपरोक्त समान नुकसान होता है।
समाधान 1 - फील्ड से final कीवर्ड को हटा दें।
public class SpellChecker {
private Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static void changeDictionary(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// dictionary का उपयोग करके लॉजिक
}
public static List suggestions(String typo) {
// dictionary का उपयोग करके लॉजिक
}
स्टेटिक उपयोगिता क्लास या सिंगलटन क्लास के शब्दकोश के लिए final कीवर्ड को हटाकर, इसे बाहरी रूप से एक अलग शब्दकोश में बदलने के लिए डिज़ाइन किया जा सकता है। हालांकि, यह विधि उपयोग करना भारी है, और मल्टीथ्रेडेड वातावरण में, यह समवर्ती समस्याओं का कारण बन सकता है।
समाधान 2 - निर्भरता इंजेक्शन का उपयोग करें।
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// dictionary का उपयोग करके लॉजिक
}
public static List suggestions(String typo) {
// dictionary का उपयोग करके लॉजिक
}
ऊपर दिए गए उदाहरण से, हम यह देख सकते हैं कि स्टेटिक क्लास और सिंगलटन क्लास को आंतरिक संसाधनों पर निर्भर नहीं होना चाहिए। दूसरे शब्दों में, आंतरिक संसाधन बाहरी रूप से इंजेक्ट किए जाने चाहिए।
निर्भरता इंजेक्शन का उपयोग करने वाली क्लास final कीवर्ड के कारण अपरिवर्तनीयता की गारंटी दे सकती है, और कई संसाधन उदाहरणों का समर्थन कर सकती है। इसके अतिरिक्त, निर्भरता इंजेक्शन का उपयोग कंस्ट्रक्टर के साथ-साथ स्टेटिक फैक्ट्री और बिल्डर में भी किया जा सकता है।
निर्भरता इंजेक्शन में संसाधन को सीधे पास करने का एक सरल तरीका है, लेकिन फैक्ट्री को पास करने का तरीका अक्सर उपयोग किया जाता है। एक फैक्ट्री एक ऐसी वस्तु है जो कॉल होने पर एक विशिष्ट प्रकार के उदाहरण को बार-बार बनाती है। यह विधि फैक्टरी मेथड पैटर्न कहलाती है, और जावा 8 में Supplier
public static List create(Supplier extends Car> generator) {
...
फैक्ट्री के प्रकार पैरामीटर को सीमित करने के लिए अक्सर सीमित वाइल्डकार्ड प्रकार का उपयोग किया जाता है। इस विधि का उपयोग करके, क्लाइंट फैक्ट्री को अपनी घोषित प्रकार की कोई भी उप-प्रकार पास कर सकता है।
निर्भरता इंजेक्शन लचीलापन और परीक्षण योग्यता में सुधार करता है, लेकिन निर्भरता-भारी परियोजनाओं के लिए यह काफी महंगा हो सकता है। ऐसे मामलों में, निर्भरता इंजेक्शन ढाँचे (डैगर, गुइस, स्प्रिंग, आदि) का उपयोग लागत को कम करने के लिए किया जा सकता है।