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