2009-04-17 11 views
6

काम पर मेरे एक कॉलेग्यू ने स्थिर कारखाने के तरीकों (प्रभावी जावा से बाहर) पर एक प्रस्तुति दी, और फिर स्थिर/सिंगलटन अपवाद प्राप्त करने के लिए इसके उपयोग का एक उदाहरण दिया।क्या सिंगलटन अपवाद काम करते हैं?

यह मेरे लिए एक लाल झंडा बंद कर दिया। अपवाद अपवाद नहीं हैं? क्या वे स्टैक ट्रेस जानकारी के लिए जेवीएम द्वारा पॉप्युलेट नहीं किए गए हैं? आप वास्तव में इसके साथ क्या बचत प्राप्त करते हैं, क्योंकि अपवाद केवल असाधारण स्थितियों के लिए ही होना चाहिए?

अपवादों पर मेरा ज्ञान अपेक्षाकृत सीमित है, इसलिए मैं इसके साथ आपके पास आ गया हूं: क्या सिंगलटन अपवाद काम करेगा, और क्या इसका उपयोग करने का कोई कारण है?

उत्तर

16

सिंगलटन अपवाद एक प्रदर्शन के अनुकूलन होने की अपेक्षा की जाती है। सोच यह है कि आप एक अपवाद बनाते समय स्टैक ट्रेस को पॉप्युलेट करने की लागत को खत्म करते हैं जो आमतौर पर अपवादों का सबसे महंगा हिस्सा होता है।

यदि अपवाद पर्याप्त रूप से अद्वितीय और वर्णनात्मक था और स्टैकट्रैक का उपयोग नहीं किया जा रहा था, तो एक सिंगलटन संभावित रूप से प्रभावी हो सकता है। आप ऐप को डिज़ाइन कर सकते हैं कि एक विशिष्ट संदेश के साथ एक विशिष्ट अपवाद प्रकार का अर्थ हमेशा एक विशिष्ट स्थान से एक अपवादित किया जाता है। फिर स्टैक ट्रेस अप्रासंगिक होगा।

April 22, 2003 Tech Tips article एक परिदृश्य में जहाँ आप एक अपवाद का पुन: उपयोग का वर्णन करता है। इस मामले में, वे बनाई गई वस्तुओं की संख्या को कम करके कचरा कलेक्टर खेलने की कोशिश कर रहे हैं। यदि आपने populateStackTrace() कॉल छोड़ दिया है, तो आपको थ्रेडिंग के बारे में चिंता करने की आवश्यकता नहीं होगी।

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

नए जेवीएम (1.4+, मुझे विश्वास है) में, "-सेवर" मोड में चलते समय यह "अनुकूलन" स्वचालित रूप से JVM द्वारा किया जा सकता है। यह हॉटस्पॉट अनुकूलन -XX:+OmitStackTraceInFastThrow विकल्प द्वारा नियंत्रित किया जा सकता है।

व्यक्तिगत रूप से, मैं सिंगलटन अपवाद [एंटी-] पैटर्न का उपयोग करने के खिलाफ अनुशंसा करता हूं।

+3

दिलचस्प जवाब। मैं आपके तीसरे पैराग्राफ से सबसे दृढ़ता से सहमत हूं; अपवाद असाधारण होना चाहिए और यदि वे प्रदर्शन समस्या का कारण बनने के लिए अक्सर गोलीबारी कर रहे हैं, तो आपको अपने कोड पर पुनर्विचार करना होगा। – Randolpho

+0

बहुत ही रोचक जवाब। OmitStackTraceInFastThrow' JVM विकल्प - [+]: –

+4

JVM वास्तव में सिंगलटन RuntimeExceptions (जैसे एनपीई) अगर एक ही स्थान पर कई बार से फेंक दिया जाता है, '-XX द्वारा नियंत्रित फेंकने शुरू कर देंगे। तो अगर कोई आपको एनपीई के साथ लॉग भेजता है और कोई बैकट्रैक नहीं भेजता है, तो हो सकता है कि :) – araqnid

1

मैं एक स्थिति है जहाँ आप अपने अपवाद की स्थिति क्या है या नहीं एक अपवाद पहले से ही अपने आवेदन के किसी अन्य भाग से निकाल दिया गया है में पता लगाने के लिए सक्षम होना चाहते हैं कल्पना कर सकते हैं; मैं उस तरह के उद्देश्य के लिए एक सिंगलटन अपवाद का उपयोग कर देख सकता हूं; लेकिन ऐसा लगता है कि अनावश्यक है। अनिवार्य रूप से, यह एक अपवाद ("कुछ हुआ") के विचार को एक अपवाद ("मेरे साथ कुछ हुआ") के विचार को भंग कर रहा है।

3

हालांकि मैं दिल से दृष्टिकोण से असहमत, सिंगलटन अपवाद कर सकते हैं एक एकल पिरोया वातावरण में काम करते हैं।

जो लोग सिंगलटन अपवाद पैटर्न का सुझाव देते हैं, वे पुराने सी-स्टाइल इनवोक/त्रुटि/चेक-त्रुटि प्रतिमान में उपयोग किए जाते हैं, और उन नई-फंक्ड "ऑब्जेक्ट ओरिएंटेड" भाषाओं में से एक में इसका अनुवाद करना चाहते हैं।

यह संभव है, लेकिन मैं इसे कोड गंध कहते हैं।

+1

सिंगलटन अपवाद एक बहुप्रचारित वातावरण में ठीक काम करते हैं। अपवाद केवल तभी संशोधित होता है जब आप fillInStackTrace() का आह्वान करते हैं। यदि आप स्टैक का उपयोग करते हैं, तो आप जितना भी थ्रेड कर सकते हैं उतने थ्रेड से एक अपवाद ऑब्जेक्ट फेंक सकते हैं। –

+1

इसके अलावा - * दृढ़ता से * सी-शैली टिप्पणी के साथ सहमत हैं। –

+1

जावा कभी भी एक थ्रेडेड वातावरण नहीं है। –

0

एक "स्थिर कारखाने विधि" एक ही वस्तु लौटने रहता है, यह वास्तव में एक कारखाने तरीका है।

यहां तक ​​कि java.lang.Throwable में उत्परिवर्तनीय स्थिति के दो आइटम हैं: स्टैक ट्रेस और प्रारंभिक कारण, जावा के एक नए संस्करण को और अधिक जोड़ता है। किसी भी साझा Throwable को या तो fillInStackTrace का अनुबंध तोड़ने या बहुत अजीब व्यवहार करने की आवश्यकता होगी।इसके अलावा, एक पुन: उपयोग किया गया Throwable संदेश को उचित रूप से बदल नहीं सकता है।

तो तुम एक तरह से इसके साथ मिल सकता है, लेकिन आप चाहते हो? लगभग सभी प्रदर्शन मुद्दों (और आपको आमतौर पर अपवाद फेंकना नहीं चाहिए) fillInStackTrace पर आते हैं। यदि आप इसे खटखटाते हैं तो थोड़ा बिंदु पुन: उपयोग होता है।

(मैं वाक्यांश "स्थिर निर्माण विधि" पसंद करते हैं "स्थैतिक कारखाने विधि" क्योंकि "फैक्टरी" जिस तरह से भी ओवरलोड हो गया है। करने के लिए)

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