मैंने हाल ही @ImplementedBy
में Google Guice में उपलब्ध एनोटेशन के बारे में पढ़ा । यह प्रोग्रामर को एक इंटरफेस के बीच एक बंधन को निर्दिष्ट करने और निर्भरता इंजेक्शन में भविष्य के उपयोग के लिए इसके कार्यान्वयन की अनुमति देता है। यह एक उचित समय के बंधन का एक उदाहरण है ।
मैं अपने सिंटैक्स का उपयोग करते हुए अपने मॉड्यूल में स्पष्ट बाइंडिंग को परिभाषित करने के लिए उपयोग किया जाता हूं:
bind(SomeInterface.class).to(SomeInterfaceImplementation.class);
प्रलेखन के अनुसार, यह @ImplementedBy
एनोटेशन के निम्नलिखित उपयोग के बराबर है :
@ImplementedBy(SomeInterfaceImplementation.class)
public interface SomeInterface {
//method declarations
}
एकमात्र लाभ जो मैं यहां देख सकता हूं वह यह है कि कोड मामूली रूप से छोटा है। उसी समय, इस दृष्टिकोण में एक ही डॉक्स द्वारा इंगित की गई कमियां हैं:
@ImplementedBy
सावधानी से उपयोग करें ; यह इंटरफ़ेस से इसके कार्यान्वयन के लिए एक संकलन-समय पर निर्भरता जोड़ता है।
इस तरह की निर्भरता कई मामलों में समस्या नहीं हो सकती है, लेकिन मैं व्यक्तिगत रूप से इसे कोड गंध के रूप में देखता हूं।
क्या उपयोग के मामले @ImplementedBy
एनोटेशन को उपयोग करने लायक बनाते हैं ?
एक संभव तरीका यह लगता है कि इसे लाइब्रेरी या फ्रेमवर्क के कोड में नियोजित किया जाए। डॉक्स में वर्णित के रूप में, एनोटेशन एक स्पष्ट रूप से आसानी से ओवरराइड करने के लिए एक डिफ़ॉल्ट बाध्यकारी प्रदान कर सकता है ।
यदि एक प्रकार दोनों
bind()
कथन में है (पहले तर्क के रूप में) और@ImplementedBy
एनोटेशन है, तोbind()
कथन का उपयोग किया जाता है। एनोटेशन एक डिफ़ॉल्ट कार्यान्वयन का सुझाव देता है जिसे बाध्यकारी के साथ ओवरराइड किया जा सकता है।
इस तरह, एक लाइब्रेरी के डेवलपर के रूप में, मैं अपने उपयोगकर्ताओं को बॉक्स से बाहर के साथ प्रदान कर सकता हूं जिसे क्लाइंट कोड में कहीं अनुकूलित किया जा सकता है।
क्या यह एनोटेशन के अस्तित्व का एकमात्र कारण है? या मुझे कुछ याद आ रहा है? क्या मैं कोड में इसका उपयोग करके कुछ हासिल कर सकता हूं जो कि केवल कुछ व्यावसायिक तर्क का ख्याल रखने वाला एक आवेदन है और न कि पुस्तकालय / ढांचे को बढ़ाया जाना है?