2008-08-26 14 views
15

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

क्या यह कुछ ऐसा है जो इसे रखने के लायक है क्योंकि इसे कई संघर्षों को विलय करने की आवश्यकता होगी, इस रिफैक्टरिंग के लिए मुझे किस तरह की स्थिति दिखाई देगी?

हम Weblogic 8.1 (ताकि JDK 1.4.2)

के तहत इस एप्लिकेशन को चला रहे हैं

खेद थॉमस, मुझे स्पष्ट करते हैं ..

प्रमुख संस्करण पारंपरिक सिंगलटन पैटर्न (निजी निर्माता है, getInstance() आदि)

शाखा संस्करण में कोई कंस्ट्रक्टर नहीं है, एक 'सार्वजनिक अमूर्त वर्ग' है और वस्तु पर सभी विधियों को 'स्थैतिक' में संशोधित किया गया है। निजी कन्स्ट्रक्टर में मौजूद कोड जो स्थिर ब्लॉक में स्थानांतरित हो जाता है।

तब कक्षा के सभी उपयोग बदल दिए गए हैं जो मर्ज में कई संघर्षों का कारण बनते हैं।

कुछ ऐसे मामले हैं जहां यह परिवर्तन किया गया था।

उत्तर

15

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

+1

एक सिंगलटन क्लास लोडर के क्लासलोडर जीवनकाल से जुड़ा हुआ है जो इसे लोड करता है, उतना ही स्थिर है। –

+5

और? सब कुछ क्लासलोडर के जीवनकाल से जुड़ा हुआ है, लेकिन एक सिंगलटन डालने से, आपको अतिरिक्त लाइफसाइकिल परत मिलती है, जिससे चीजों को सही तरीके से संभालने के लिए अधिक संभावनाएं (अंतिम रूप) होती हैं। –

0

क्या यह चर्चा मदद करती है? (मैं अगर यह एक और प्रोग्रामिंग मंच से जोड़ने के लिए वर्जित है पता नहीं है, लेकिन मैं नहीं बल्कि न सिर्फ पूरी चर्चा बोली होगी =))

Sun Discussion on this subject

फैसले होने के लिए है कि यह नहीं है लगता है ज्यादातर मामलों में महत्वपूर्ण बातों के लिए पर्याप्त अंतर, हालांकि तकनीकी रूप से स्थिर तरीके अधिक कुशल हैं।

3

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

  1. सिंगलटन वस्तु है जो मैं और अधिक स्पष्ट कर रहा हूँ बनाने करता है:

    खुद इन सवालों से पूछो?

  2. क्या मुझे इस कार्य को करने के लिए किसी ऑब्जेक्ट की आवश्यकता है या क्या यह स्थिर तरीकों के लिए अधिक उपयुक्त है?
  3. क्या मुझे सिंगलटन का उपयोग न करके प्रदर्शन की आवश्यकता है?
+0

प्रश्न वास्तव में प्रदर्शन लाभ के बारे में है :-) मान लें कि आपके पास एक नियंत्रक है जो प्रति सेकंड 100 अनुरोधों को संभालता है। क्या यह एक स्टेटलेस सेवा के रूप में सिंगलटन या कक्षा के बीच चयन करने के लिए प्रासंगिक है? – lisak

16

यदि मैं किसी भी राज्य, और स्थैतिक कक्षाओं को स्टोर करने की आवश्यकता है तो मैं एक सिंगलटन का उपयोग करूंगा। कुछ इंस्टॉलेशन करने में कोई बात नहीं है, यहां तक ​​कि एक उदाहरण भी, जब तक कि इसे कुछ स्टोर करने की आवश्यकता न हो।

3

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

11

स्थैतिकता के लिए स्टेटिक खराब है क्योंकि स्थैतिक तरीकों और क्षेत्रों को उप-वर्गों द्वारा विस्तारित या ओवरराइड नहीं किया जा सकता है।

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

सिंगलटन आम तौर पर एक ठीक पैटर्न होता है जब कम से कम उपयोग किया जाता है। मैं एक डी ढांचे का उपयोग करना पसंद करता हूं और यह मेरे लिए मेरे उदाहरणों को प्रबंधित करने देता हूं (संभवतः विभिन्न क्षेत्रों में, जैसे कि गुइस में)।

0

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

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