2012-03-27 8 views
5

मुझे यकीन नहीं है कि इससे पहले एक समान प्रश्न पूछा गया है, इसकी खोज की गई है, लेकिन कोई उपयोगी उत्तर नहीं मिला।जावा में सेटर्स बनाम ओवरलोडेड कन्स्ट्रक्टर

जैसा कि सवाल बताता है, बेहतर क्या है, अधिभारित कन्स्ट्रक्टर होने या एकाधिक सेटर फ़ंक्शन होने के कारण क्या बेहतर है?

परिदृश्य:

public class Something { 

    private int a; 
    private int b; 

    public Something(int a, int b) { 
     this.a = a; 
     this.b = b; 
    } 
    ... // Do Something 
} 

अब, मेरी बुनियादी आवश्यकता थी दो पैरामीटर केवल के लिए के लिए। अब कल, आवश्यकता बदल दी गई है और मुझे एक नया पैरामीटर, सी और फिर अगले दिन डी जोड़ने के लिए कहा गया है, और एक बयान दिया गया है जिसमें कहा गया है कि हमारे पास और फ़ील्ड हो सकते हैं।

मेरे पास पहले से ही कई प्रोजेक्टर में इस कन्स्ट्रक्टर के लिए निर्भरता है। अब, मेरे प्रश्न पर वापस

  • क्या यह पहले से अधिभारित कन्स्ट्रक्टर में नए फ़ील्ड जोड़ने के लिए सलाह दी जाती है?
  • हर बार एक नया अधिभार कन्स्ट्रक्टर बनाएं जब भी मुझे एक नया फ़ील्ड जोड़ने की आवश्यकता हो ताकि मैं आश्रित कोड तोड़ूं?
  • या बस डिफ़ॉल्ट खाली डिफ़ॉल्ट निर्माता का उपयोग करें और केवल setters का उपयोग

सलाह है कि आप मुझे दे सकते हैं क्या है (मेरे अचल स्थिति है, जो उच्च चिंता का नहीं है अप खिलवाड़)?

+4

"मेरी अपरिवर्तनीयता को गड़बड़ाना, जो उच्च चिंता का नहीं है" यदि आप कुछ वर्ग अपरिवर्तनीय (और इस प्रकार के बारे में तर्क करना आसान) बनाने के प्रयास में गए हैं, तो उस काम को हल्के ढंग से फेंक न दें। –

+1

'... बेहतर क्या है, एक अधिभारित कन्स्ट्रक्टर होने या एकाधिक सेटर फ़ंक्शंस होने के साथ?" "हां"। लेकिन गंभीरता से, यह सब संदर्भ पर निर्भर करता है। कभी-कभी आपको दोनों की आवश्यकता होती है, कभी-कभी आपको जावाबीन प्रतिबंधों के भीतर काम करने की आवश्यकता होती है, ... –

उत्तर

9

ऐसा करने का सबसे सुखद तरीका है अपने कन्स्ट्रक्टर को फ़ील्ड जोड़ने के लिए - सेटर्स का मतलब है कि आपके पास अपरिवर्तनीय वस्तुएं नहीं हो सकती हैं, और अपरिवर्तनीय वस्तुएं हमेशा अच्छी होती हैं - लेकिन संभवतः builder pattern की जांच करने के लिए, जो संभवतः आपको खुद को केवल एक कन्स्ट्रक्टर तक सीमित करने में मदद करता है जिसे बुलाया जाता है और बिल्डर ऑब्जेक्ट द्वारा "भर दिया जाता है"।

+1

कन्स्ट्रक्टर/विधि ओवरलोडिंग भ्रमित हो सकती है। बिल्डर पैटर्न कभी-कभी उपयोगी होता है। (+1) –

1

विभिन्न रचनाकारों का उद्देश्य कक्षा की पुन: प्रयोज्यता को बढ़ाने के लिए है। मुझे लगता है कि कुछ अलग-अलग रचनाकारों के लिए यह बहुत उपयोगी होगा जो बहुत से सेटर्स होने की बजाय आपकी ज़रूरतों को पूरा करते हैं। इसके अलावा निर्माता अधिक विशिष्ट हैं और आपकी कक्षा और एपीआई की पठनीयता में सुधार करते हैं।

+0

दरअसल, जहां तक ​​एपीआई पठनीयता और पुन: प्रयोज्यता जाती है, सेटर्स का लाभ होता है, आईएमओ। आप जो सेट करना चाहते हैं उसे चुन सकते हैं और चुन सकते हैं, और जो लोग उन्हें आमंत्रित करते हैं उन्हें देखता है, वे जानते हैं कि वे क्या करते हैं, उदाहरण के लिए, कन्स्ट्रक्टर के पहले और दूसरे स्ट्रिंग पैरामीटर, और सोचते हैं कि उन्हें क्या होना चाहिए , और जो कौन सा है। – trutheality

4

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

फिर भी, आपकी सहजताएं सही हैं: रचनाकार अनावश्यक हो सकते हैं। अन्य पोस्टर को फिर से दूसरी बार, builder pattern आपको इस स्थिति में दोनों दुनिया के सर्वश्रेष्ठ प्रदान कर सकता है। यदि आप नहीं चाहते कि निर्माता उत्पाद की घोंसला वाली कक्षा हो, जैसा कि इसे जावा उदाहरण में विकिपीडिया आलेख में चित्रित किया गया है, तो उसे उत्पाद के समान पैकेज में रखें, और उत्पाद पैकेज-संरक्षित सेटर्स दें । साथ ही, जब कॉलर पूर्ण होने की घोषणा करता है तो आप अनिवार्य गुणों की सेटिंग को लागू करने के लिए तर्क जोड़ सकते हैं।

0

अपनी अन्य परियोजनाएं जो नए पैरामीटर से किसी भी तरह से 2-Arg कन्स्ट्रक्टर लाभ पर निर्भर करती हैं? क्या 2-Arg रचनाकार आपकी नई आवश्यकताओं के साथ समझ में आते हैं?

शायद आपको एक और कक्षा बनाने की आवश्यकता है, उदा। SomethingEx(Something) जो अतिरिक्त फ़ील्ड लेगा और विभिन्न रचनाकार होंगे, लेकिन उपयोगी विधियों को साझा करेंगे।

यदि साझा करने के लिए उपयोगी तरीके कम और बहुत कम हैं, तो कम निर्भरता रखने के लिए, पूरी तरह से अलग वर्ग बनाना बेहतर हो सकता है।

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