सिंगलटन
सिंगलटन की अवधारणा
सिंगलटन एक ऐसा वर्ग है जिसका केवल एक ही इंस्टेंस बनाया जा सकता है। सिंगलटन का एक विशिष्ट उदाहरण स्टेटलेस ऑब्जेक्ट या एक अद्वितीय सिस्टम घटक है। हालाँकि, सिंगलटन क्लास को टेस्ट करना मुश्किल होता है जब तक कि प्रकार को इंटरफ़ेस के रूप में परिभाषित नहीं किया जाता है और इसे इसके कार्यान्वयन के रूप में परिभाषित नहीं किया जाता है।
सिंगलटन बनाने के तरीके
public static सदस्य जो final फ़ील्ड है, का उपयोग करना
निजी कन्स्ट्रक्टर केवल एक बार Elvis इंस्टेंस को इनिशियलाइज़ करते समय बुलाया जाता है, जिससे यह सुनिश्चित होता है कि यह पूरे सिस्टम में अद्वितीय है। हालाँकि, AccessibleObject.setAccessible() का उपयोग करके निजी कन्स्ट्रक्टर को कॉल किया जा सकता है। इस तरह के रिफ्लेक्शन हेरफेर को रोका जा सकता है, जैसे कि दूसरी ऑब्जेक्ट बनाते समय अपवाद फेंकना।
- लाभ
- API में स्पष्ट रूप से यह दिखाई देता है कि यह क्लास सिंगलटन है।
- यह संक्षिप्त है।
public static के साथ स्टेटिक फैक्ट्री मेथड देना
रिफ्लेक्शन के माध्यम से हेरफेर को छोड़कर, यह विधि भी यह सुनिश्चित करती है कि यह पूरे सिस्टम में अद्वितीय है। बस फ़ील्ड को निजी में बदल दिया जाता है, और ऑब्जेक्ट को लौटाने के लिए स्टेटिक फैक्ट्री मेथड का उपयोग किया जाता है।
- लाभ
- API को बदले बिना सिंगलटन को गैर-सिंगलटन में बदला जा सकता है।
- उदाहरण के लिए, स्टेटिक फैक्ट्री मेथड को कॉल करने वाले थ्रेड के आधार पर एक अलग इंस्टेंस लौटाने के लिए बनाया जा सकता है।
- यदि आवश्यक हो, तो इसे जेनेरिक सिंगलटन फैक्ट्री मेथड में बदला जा सकता है।
- स्टेटिक फैक्ट्री के मेथड रेफरेंस को प्रोवाइडर के रूप में इस्तेमाल किया जा सकता है।
- उदाहरण के लिए, Elvis::getInstance के बजाय, आप Supplier<Elvis> का उपयोग कर सकते हैं।
- API को बदले बिना सिंगलटन को गैर-सिंगलटन में बदला जा सकता है।
यदि इन लाभों का उपयोग करने की आवश्यकता नहीं है, तो पहला तरीका उपयोग करना बेहतर है।
एन्यूमरेटेड टाइप का उपयोग करना
एन्यूमरेटेड टाइप का उपयोग करना सबसे अच्छा तरीका है। यह ऊपर बताए गए दो तरीकों की तुलना में रिफ्लेक्शन हमलों के लिए अधिक सुरक्षित है और कोड भी साफ है। इसके अतिरिक्त, जैसा कि नीचे बताया गया है, ऊपर बताए गए दो तरीकों में सीरियलाइजेशन करते समय अतिरिक्त कोड जोड़ने की आवश्यकता होती है।
हालांकि, यह ध्यान रखना महत्वपूर्ण है कि सिंगलटन जिसे आप बनाना चाहते हैं वह इंटरफ़ेस को विरासत में प्राप्त कर सकता है, लेकिन क्लास को विरासत में प्राप्त नहीं कर सकता है।
सिंगलटन क्लास को सीरियलाइज़ करते समय सावधानियां
यदि आप ऊपर बताए गए पहले या दूसरे तरीके से बनाए गए सिंगलटन क्लास को सीरियलाइज़ करना चाहते हैं, तो आपको केवल Serializable को लागू करने के अलावा, सभी इंस्टेंस फ़ील्ड को transient के रूप में घोषित करना होगा और readResolve() मेथड को ओवरराइड करके देना होगा।
टिप्पणियाँ0