2013-11-01 16 views
5

मेरे पास एक कक्षा है जिसमें एक कन्स्ट्रक्टर है जहां सभी तर्क GUICE द्वारा इंजेक्शन दिए जाते हैं।गैर-इंजेक्शन वाले फ़ील्ड के साथ गुइस इंजेक्शन वाले फ़ील्ड के साथ जावा कन्स्ट्रक्टर

Public class Order { 

    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 

    @Inject 
    public order(ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 
} 

अब, मैं एक और क्षेत्र (जैसे कि, पूर्णांक स्थिति) चर जो इंजेक्शन नहीं किया जा सकता जोड़ना चाहते हैं।

क्या यह सभी इंजेक्शन पैरामीटर के साथ पहले ऑब्जेक्ट बनाने के लिए एक अच्छा अभ्यास है और फिर नया फ़ील्ड सेट करें जिसे एक सेटर विधि से इंजेक्शन नहीं दिया जा सकता है?

public class OrderFactory { 

    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 

    @Inject 
    public order(ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 

    //getter methods for all the above variables 

    public ClassOne getclassOneObj(){ 
      return classOneObj; 
    } 
    .... 

    public Order createOrder(int status) { 
     return new Order(status, classOneObj, classTwoObj); 
    } 
} 

फिर नए आदेश वर्ग की तरह

public class Order { 

    int status 
    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 


    public order(int status, ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.status = status 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 

    //getter methods for all these member variables 
} 

अब देखो आदेश वस्तु मैं लूंगा बनाने के लिए होगा:

मैं नीचे दिए गए के रूप में एक और दृष्टिकोण है, जहां मैं एक कारखाने श्रेणी का निर्माण के साथ आया था पहले ऑर्डर फैक्ट्री ऑब्जेक्ट बनाएं और फिर "createOrder" विधि का उपयोग करके मैं ऑर्डर ऑब्जेक्ट बनाउंगा।

मैं बॉयलरप्लेट कोड लिखने के साथ समाप्त हो रहा हूं। यकीन नहीं है कि यह एक अच्छा अभ्यास है। क्या कोई इस पर सुझाव दे सकता है कि यह दृष्टिकोण सही है या इस समस्या के लिए कोई बेहतर तरीका है?

मैंने Google Guice में पढ़ा और पाया कि ऐसे मामलों के लिए सहायक इंजेक्शन के लिए @Assisted सुविधा है। लेकिन मुझे वह जटिल मिला और खुद को यह विश्वास नहीं कर सका कि मुझे इसके मामले में इसके साथ जाना चाहिए या नहीं।

किसी भी सुझाव या मार्गदर्शन के लिए अग्रिम धन्यवाद।

+0

इलुक्स को प्रतिबिंबित करना, कारखानों के लिए आपका मैन्युअल दृष्टिकोण ठीक है, हालांकि आप बहुत कम फैशन में सहायक इंजेक्शन काम कर सकते हैं। एकमात्र चीज जो मैं आपके मैनुअल इंजेक्शन के बारे में बदलूंगा वह एक 'प्रोडर ' और 'प्रदाता ' इंजेक्ट करना है, यदि आप एक ही ऑर्डर फैक्ट्री के साथ कई अलग-अलग ऑर्डर बनाना चाहते हैं। अन्यथा, यह बहुत अच्छा लग रहा है। –

उत्तर

-1

आप आमतौर पर ऐसी चीजों को इंजेक्ट करने जा रहे हैं जो निर्माण के लिए कुछ प्रयास करें। यदि आप केवल एक int फ़ील्ड इंजेक्शन कर रहे हैं, तो आप ऑब्जेक्ट पर केवल एक सेटटर विधि को कॉल करना बेहतर होगा (जिसमें इसकी कुछ जटिल निर्भरता इंजेक्शन दी गई है)। साथ ही, यदि फ़ील्ड अक्सर बदलती हैं, जैसा कि "स्थिति" नामक फ़ील्ड द्वारा निहित किया गया है, तो यह इंजेक्शन के लिए भी एक अच्छा उम्मीदवार नहीं है।

+1

जब भी संभव हो तो सेटर्स से बचें। यदि ऑब्जेक्ट को अपरिवर्तनीय और उसके सभी फ़ील्ड 'अंतिम' रखने का कोई मौका है, तो ऐसा करें। – iluxa

+0

+1 iluxa के लिए +1। अपरिवर्तनीय वस्तुओं में [बहुत सारे फायदे हैं] (http://stackoverflow.com/a/214718/1426891)।हम सभी सहमत हैं कि 'स्थिति' इंजेक्शन करना एक बुरा विचार है, लेकिन ओपी का सवाल इंजेक्शन को _non-injected_ कन्स्ट्रक्टर तर्कों के साथ सह-अस्तित्व देने के बारे में था, जिसके लिए कई वैध उपयोग-मामले हैं। –

+0

हाँ, Google के लिए काम करने से आपको चीज के बारे में कुछ या दो सिखाता है, यह नहीं है ... :-) – iluxa

4

आपका कारखाना दृष्टिकोण उत्कृष्ट है। कृपया सेटर्स का उपयोग न करें: यदि फ़ील्ड अपरिवर्तनीय बना दिया जा सकता है, तो यह अपरिवर्तनीय होना चाहिए, चाहे वह तुरंत "सुविधाजनक" हो।

एक अन्य दृष्टिकोण जो आप ले सकते हैं Assisted Injection है, जो इस सटीक समस्या को हल करता है। कि के साथ, आप केवल कारखाने इंटरफेस को परिभाषित है, और इसके कार्यान्वयन के जादुई Guice द्वारा आपको दिया जाता है:

class Order { 
    interface Factory { 
    Order create(Status status); 
    } 

    @AssistedInject Order(
     ClassOne one, 
     ClassTwo two, 
     @Assisted Status status) { 
    } 
} 

मॉड्यूल कोड:

bind(Order.Factory.class).toProvider(
    FactoryProvider.newFactory(Order.Factory.class, Order.class)); 

फिर ग्राहकों इंजेक्षन Factory और इसका इस्तेमाल करते हैं जैसे वे करते हैं आपके उदाहरण में

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

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