12

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

फायदे/किताब से नुकसान सारांश नीचे दिया:

लाभ:

  1. वे नाम है!
  2. हम कुल उदाहरण नियंत्रण (Singletons, प्रदर्शन, आदि)
  3. वे एक उप-प्रकार/इंटरफ़ेस लौट सकते हैं
  4. संकलक प्रकार निष्कर्ष

नुकसान प्रदान कर सकते हैं:

  1. निजी वर्गों को
  2. उप-वर्गीकृत नहीं किया जा सकता है वे प्रलेखक के रूप में प्रलेखन में खड़े नहीं हैं रों करना

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

ऐसा लगता है कि अंत में कारखाने के तरीकों में रचनाकारों के लगभग सभी फायदे हैं, कई कई और फायदे, और कोई वास्तविक नुकसान नहीं!

तो, मेरे सवाल का तीन भागों में मूल रूप से है:

  1. यह अच्छा अभ्यास हमेशा कंस्ट्रक्टर्स से अधिक डिफ़ॉल्ट रूप से स्थिर कारखाने तरीकों का उपयोग करने के लिए है?
  2. क्या यह कभी भी रचनाकारों का उपयोग करने के लिए उचित है?
  3. ऑब्जेक्ट उन्मुख भाषाएं कारखानों के लिए भाषा स्तर का समर्थन क्यों नहीं देती हैं?

नोट: दो इसी तरह के सवाल कर रहे हैं: When to use a Constructor and when to use getInstance() method (static factory methods)? और Creation of Objects: Constructors or Static Factory Methods। हालांकि उत्तर या तो उपर्युक्त सूची प्रदान करते हैं या स्थैतिक फैक्ट्री विधियों के पीछे तर्क को दोहराते हैं जिन्हें मैं पहले से ही जानता हूं।

+0

इसके अलावा, स्पष्ट रूप से कारखानों के पास रचनाकारों पर थ्रेड-सुरक्षा के फायदे भी हैं [इस] (http://madpropellerhead.com/random/20100328-java-final-fields-are-not-as-final-as- आप सोच सकते हैं)। – MadChuckle

+0

मैंने संदर्भित आलेख पढ़ा, लेकिन लेखक के रूप में विपरीत निष्कर्ष पर आया ... :-) मुझे लगता है कि क्या इंगित किया गया है, लेकिन असहमत है। शायद इसे विशिष्ट उपयोग मामलों के साथ करना होगा जिसे हम प्रत्येक कोडिंग करते समय देखते हैं। –

+0

@BrianKnoblauch, मैं समवर्तीता पर विशेषज्ञ नहीं हूं इसलिए मैं इसके लिए अपना शब्द ले जाऊंगा क्योंकि उदाहरण कुछ हद तक प्रतीत होते हैं :) – MadChuckle

उत्तर

7

स्थिर कारखानों को अभी भी अंत में एक निर्माता को कॉल करना होगा। आप अधिकांश कार्यक्षमता को स्थिर कारखाने में स्थानांतरित कर सकते हैं, लेकिन आप एक कन्स्ट्रक्टर का उपयोग करने से बच नहीं सकते हैं।

दूसरी तरफ साधारण मामलों के लिए, आप स्थिर कारखाने के बिना केवल एक कन्स्ट्रक्टर रख सकते हैं।

कन्स्ट्रक्टर अंतिम फ़ील्ड सेट करने का एकमात्र तरीका है, जो आईएमएचओ गैर-अंतिम क्षेत्रों के लिए बेहतर है।

आप उप-वर्गों में रचनाकारों का उपयोग कर सकते हैं। आप एक उप-वर्ग के लिए स्थिर कारखानों का उपयोग नहीं कर सकते हैं।

यदि आपके पास एक घटक की निर्भरता बनाने के लिए एक अच्छा निर्भरता इंजेक्शन ढांचा है, तो आप पाएंगे कि स्थिर कारखानों में ज्यादा वृद्धि नहीं होती है।

(कैसे यदि आप एक निर्माता के ऊपर एक कारखाने विधि के पक्ष में करना चाहिए तय करने के लिए पर),

"आप क्या तय करने के लिए 'की जरूरत है:

+0

बेशक कारखानों दृश्यों के पीछे रचनाकारों का उपयोग करते हैं और इसलिए मैंने तीसरा सवाल भी शामिल किया। और कारखानों निश्चित रूप से रचनाकारों का उपयोग कर अंतिम फ़ील्ड सेट कर सकते हैं। मैं आपके द्वारा उल्लिखित उप-वर्ग प्रतिबंधों के बारे में नहीं समझता; विस्तृत करने के लिए परवाह? – MadChuckle

+0

ठीक है, ऐसा लगता है कि आप वहां पहले नुकसान के बारे में बात करते हैं; लेकिन हो सकता है कि हम इसके लिए कारखानों के अलावा 'निर्माता' प्रदान कर सकें? – MadChuckle

+0

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

3

मैं इसी तरह के सवाल आप पर प्रकाश डाला में से एक से टिप्पणी की तरह फिर से पूरा करने की कोशिश कर रहे हैं। या तो आप नहीं चाहते हैं कि लोग आपके कन्स्ट्रक्टर को कॉल करें (आप एक सिंगलटन या फैक्ट्री बना रहे हैं), या आपको कोई फर्क नहीं पड़ता (जैसे ऊपर संख्या संख्या में, जहां वे सुविधा के लिए कुछ ऑब्जेक्ट्स शुरू कर रहे हैं कॉलर का) "

मेरे लिए, इसका मतलब है कि यह उचित है एक कन्स्ट्रक्टर का उपयोग करें, जहां फैक्ट्री विधि की आवश्यकता नहीं है। फैक्ट्री की किसी भी ज़रूरत के बिना, यह सिर्फ कोड को पालन करने के लिए कठिन बनाता है ("कौन सा सटीक उप-वर्ग यहां लौटाया गया है?")

+2

रुको। लेकिन बिंदु का हिस्सा यह है कि कॉलर को _care_ नहीं होना चाहिए जो सटीक सबक्लास लौटाया गया है, और आप बदल सकते हैं कि आपके कॉलर्स को बदलने के बिना कौन सा सटीक सबक्लास वापस कर दिया गया है। –

+0

सच है, लेकिन यदि वे उप-वर्ग विभिन्न तरीकों से उस एपीआई को कार्यान्वित करते हैं, तो आपको कोड में समस्याओं को ट्रैक करने का प्रयास करते समय शायद सटीक सबक्लास लौटाया जाना चाहिए। उन परिस्थितियों में, मुझे कारखाने के तरीके अस्पष्ट चीजें मिलती हैं। –

+0

@ डिस्को 3: एक वैध फैक्ट्री विधि को * कॉलर के * परिप्रेक्ष्य से, माता-पिता वर्ग की तरह कुछ तरीकों से व्यवहार करना चाहिए, लेकिन इसका मतलब यह नहीं है कि आंतरिक व्यवहार से मेल खाना पड़ेगा। उदाहरण के लिए, यदि 'स्ट्रिंग' आंतरिक रूप से विरासत योग्य था, स्ट्रिंग्स का संयोजन, जब एक या अधिक 256 वर्णों से अधिक हो तो 'कंसेटेनेटेड स्ट्रिंग' ऑब्जेक्ट लौटा सकता है जो छोटे तारों के संदर्भों की एक सरणी रखेगा। 'ConcatenatedString' के सभी तरीकों से वही परिणाम मिलेगा जैसे स्ट्रिंग मूल से सभी पात्रों को शामिल करेगी, लेकिन ... – supercat

3

मैं जोश ब्लोच के साथ बहुत मजबूत समझौते में हूं, और वह मामला बेहतर बनाता है मैं कर सकता था, लेकिन यहां कुछ ऐसे स्थान हैं जहां स्थिर कारखानों उपयुक्त नहीं हैं:

  • जब निर्भरता इंजेक्शन अधिक समझदार होता है; डी सिस्टम (निश्चित रूप से गुइस) अपने रचनाकारों के माध्यम से चीजों को इंजेक्ट करते हैं। विशेष रूप से, डी उचित है जब आप उम्मीद करते हैं कि भविष्य में निर्माता के पैरामीटर बदल सकते हैं।
  • जब आप विशेष रूप से लोगों को उप-वर्ग लिखने का इरादा रखते हैं, और आप उन्हें लागू करने के लिए एक कंकाल प्रदान कर रहे हैं।
+0

अच्छे अंक! यद्यपि डी सिस्टम को कुछ फायदे के साथ फैक्ट्री पैटर्न द्वारा भी कार्यान्वित किया जा सकता है (), मैं सहमत हूं इस पर आप के साथ। – MadChuckle

+0

जबकि एक डीआई सिस्टम जो केवल रचनाकारों के बारे में जानता है, रचनाकारों का उपयोग करने तक ही सीमित होगा, और एक जो किसी विशेष नाम के साथ स्थैतिक फैक्ट्री विधियों की अपेक्षा करता है, उस नाम की विधि के साथ कक्षाओं तक ही सीमित होगा, क्या रचनाकार डीआई परिप्रेक्ष्य से विशेष लाभ प्रदान करते हैं? क्या * सार्वजनिक * निर्माता कारखाने के तरीकों पर किसी भी उप-वर्गीकरण लाभ प्रदान करते हैं (निश्चित रूप से संरक्षित कन्स्ट्रक्टरों को उप-वर्गीकरण के लिए आवश्यक होगा)। – supercat

0

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

उबाऊ सामान। आइए कुछ और मजेदार और बौद्धिक चुनौतीपूर्ण करें ...

सिर्फ रिकॉर्ड्स के लिए: मैं प्रश्न और अन्य उत्तरों में उल्लिखित बिंदुओं की उपेक्षा नहीं करता, मैं बस यह अतिरिक्त बिंदु जोड़ना चाहता था।