2010-10-25 20 views

उत्तर

37

Supplier इंटरफ़ेस बस एक नो-आर्ग समारोह है कि एक मान देता है की एक अमूर्त यह एक वस्तु के कुछ उदाहरण या उदाहरणों होने का एक साधन है है ...। चूंकि यह बहुत सामान्य है, इसे कई चीजों के रूप में उपयोग किया जा सकता है। जेरेड ने समझाया कि Multimaps कारखानों ने इसे किसी प्रकार के मूल्यों के Collection का नया उदाहरण बनाने के लिए कारखाने के रूप में उपयोग किया है।

इंटरफ़ेस की सादगी को देखते हुए, यह किसी अन्य Supplier में लपेटकर Supplier के व्यवहार की कुछ बहुत ही शक्तिशाली सजावट की अनुमति देता है जो किसी भी तरह से इसके व्यवहार को बदल देता है। यादें इसका एक उदाहरण है। मैंने Suppliers.memoizeWithExpiration विधि को स्वयं बनाने के लिए एक आसान तरीका के रूप में उपयोग किया है, इसलिए कुछ डेटा केवल एक समय से एक सर्वर से पढ़ा जाएगा।

मैं भी गिसिस पर एक नज़र डालने की सिफारिश करता हूं और Provider इंटरफ़ेस का उपयोग कैसे किया जाता है। Provider बिल्कुल Supplier के बराबर है और यह गुइस कैसे काम करता है इसके लिए केंद्रीय है।

  • Provider उपयोगकर्ताओं को किसी दिए गए वर्ग की नई वस्तुओं को बनाने का एक कस्टम तरीका परिभाषित करने की अनुमति देता है। उपयोगकर्ता get() विधि लिख सकते हैं जो किसी ऑब्जेक्ट को बनाने के लिए जो भी कोड आवश्यक है, निष्पादित कर सकते हैं, इसलिए वे ऑब्जेक्ट बनाने के लिए अकेले गिइस का उपयोग करने वाले रचनाकारों तक सीमित नहीं हैं। यहां, वे ऑब्जेक्ट के नए उदाहरण के लिए एक कस्टम फैक्टरी परिभाषित करने के लिए इसका उपयोग कर रहे हैं।
  • गुइस किसी भी निर्भरता के Provider के इंजेक्शन की अनुमति देता है। यह हर बार get() कहलाता है या यह Provider बाध्यकारी को दर्शाता है कि यह कैसे एक उदाहरण या किसी भी चीज़ को वापस कर सकता है, यह एक नया उदाहरण लौटा सकता है। यह निर्भरताओं के "आलसी तत्काल" के लिए भी अनुमति देता है ...Provider एक कक्षा एक ऑब्जेक्ट बनाने के माध्यम से वास्तव में समय से पहले ऑब्जेक्ट बनाने की आवश्यकता के बिना देता है। ऑब्जेक्ट का एक उदाहरण तब तक बनाने की आवश्यकता नहीं है जब तक, और यदि, get() कहा जाता है।
  • जैसा ऊपर बताया गया है, Provider एस गुइस में स्कोपिंग का आधार है। यदि आप Scope इंटरफ़ेस पर एक नज़र डालें, तो आप देखेंगे कि इसकी एकल विधि Provider<T> scope(Key<T> key, Provider<T> unscoped)Provider एस के संदर्भ में परिभाषित है। इस विधि को ऐसा लगता है जो किसी ऑब्जेक्ट (Provider<T> unscoped) का एक नया उदाहरण बनाता है और उस पर आधारित Provider<T> देता है जो उस क्षेत्र के आधार पर लागू होता है जो किसी भी नीति को लागू करता है, संभावित रूप से ऑब्जेक्ट के कुछ कैश किए गए उदाहरण को एक नया बनाने के बजाय। डिफ़ॉल्ट NO_SCOPE गुंजाइश बस unscoped प्रदाता के साथ गुजरती है, जिसका अर्थ है कि हर बार एक नया उदाहरण बनाया जाएगा। SINGLETON स्कोप पहली कॉल के परिणाम को unscoped.get() पर कैश करता है और उसके बाद उस एकल उदाहरण को लौटाता है, यह सुनिश्चित करता है कि सिंगलटन-स्कोप्ड ऑब्जेक्ट पर निर्भर करता है कि सब कुछ उस ऑब्जेक्ट का संदर्भ प्राप्त करता है। ध्यान दें कि SINGLETON स्कोप की scope विधि द्वारा लौटाई गई आवश्यक रूप सेSupplierSuppliers.memoize (हालांकि यह थोड़ा अधिक जटिल है) द्वारा लौटा दी गई है।
7

यह एक अप्रत्यक्ष वस्तु प्रदान करने का एक तरीका है। आप प्रत्येक बार Supplier.get() is नामक एक और वस्तु प्रदान करना चाह सकते हैं।

उदाहरण के लिए, मेरे पास SmtpMailSender नामक सिंगलटन क्लास है, जो smtp सर्वर के लिए होस्टनाम लेता है। हालांकि, होस्टनाम रनटाइम पर बदल सकता है, इसलिए String hostname लेने के बजाय, यह Supplier<String> hostname लेता है।

0

Suppliers वर्ग देखें और मुझे लगता है कि तरीकों वहाँ किसी भी तरह अपने प्रश्न का उत्तर होगा।

14

मुख्य कारण हम अमरूद में प्रदायक शामिल Multimaps तरीकों कि मनमाने ढंग से Multimaps उत्पन्न करते हैं, इस तरह के

public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map, 
    Supplier<? extends Collection<V>> factory) 

प्रदायक बनाता है के रूप में समर्थन करने के लिए था एक संग्रह जो किसी दिए गए कुंजी के लिए सभी मान रखता है। मल्टीमैप प्रदायक का उपयोग करता है जब भी आप एक कुंजी-वैल्यू जोड़ी को उस कुंजी के साथ संग्रहीत करते हैं जो पहले से ही मल्टीमैप में नहीं है।

+0

आप आपूर्तिकर्ताओं में mnemonize के बारे में पता है ताकि के लिए एक नमूना भी दे कृपया कार्य करें:

वैसे भी, यहाँ कुछ उदाहरण कोड है। – Emil

+1

@Emil: 'memoize' का उपयोग होता है उदा। [यहां] (http://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/3636791#3636791) – maaartinus

1

कक्षा का एक और बड़ा उपयोग decoupling है - यदि कोई घटक केवल मूल्य प्राप्त करने के लिए किसी अन्य का उपयोग करता है, तो ठोस कार्यान्वयन पर निर्भर नहीं है, लेकिन इस इंटरफ़ेस पर निर्भर करता है। ? http://www.slideshare.net/tfnico/google-guava

संबंधित मुद्दे