![translation](https://cdn.durumis.com/common/trans.png)
यह एक AI अनुवादित पोस्ट है।
भाषा चुनें
durumis AI द्वारा संक्षेपित पाठ
- सिंगलटन एक ऐसा क्लास है जिसका केवल एक उदाहरण बनाया जा सकता है, जिसका उपयोग स्टेटलेस ऑब्जेक्ट या अद्वितीय सिस्टम घटकों को लागू करने के लिए किया जाता है।
- सिंगलटन बनाने के तरीके में पब्लिक स्टैटिक सदस्य जो फाइनल फील्ड है, स्टैटिक फैक्टरी मेथड का उपयोग करने का तरीका, एनम टाइप का उपयोग करने का तरीका शामिल है, और एनम टाइप का उपयोग करने का तरीका सबसे अच्छा है।
- जब एक सिंगलटन क्लास को सीरियलाइज किया जाता है, तो आपको केवल Serializable को लागू करने के अलावा, सभी उदाहरण फ़ील्ड को transient के रूप में घोषित करना होगा और readResolve() विधि को फिर से परिभाषित करना होगा।
सिंगलटन
सिंगलटन की अवधारणा
सिंगलटन एक ऐसा वर्ग है जो केवल एक ही उदाहरण बना सकता है। सिंगलटन का एक विशिष्ट उदाहरण स्टेटलेस ऑब्जेक्ट या एक अनूठा सिस्टम घटक है। हालाँकि, सिंगलटन वर्गों को परीक्षण करना मुश्किल होता है जब तक कि उन्हें इंटरफ़ेस में परिभाषित नहीं किया जाता है और उनकी अपनी कार्यान्वितियों के साथ, इसके अलावा वे हैं।
सिंगलटन बनाने के तरीके
सार्वजनिक स्थिर सदस्य जो अंतिम क्षेत्र है
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void speak() {
System.out.println("elvis");
}
निजी कंस्ट्रक्टर को केवल एक बार तब बुलाया जाता है जब एल्विस उदाहरण को इनिशियलाइज़ किया जाता है, यह सुनिश्चित करता है कि यह पूरे सिस्टम में अद्वितीय है। हालांकि, निजी कंस्ट्रक्टर को AccessibleObject.setAccessible() का उपयोग करके बुलाया जा सकता है, और इस तरह के रिफ्लेक्शन हेरफेर को दूसरा ऑब्जेक्ट बनाते समय अपवाद फेंककर रोका जा सकता है।
- लाभ
- यह स्पष्ट रूप से API में स्पष्ट है कि वर्ग एक सिंगलटन है।
- यह संक्षिप्त है।
सार्वजनिक स्थिर के रूप में एक स्थिर फ़ैक्टरी विधि प्रदान करना
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public static Elvis getInstance() {
return INSTANCE;
}
public void speak() {
System.out.println("elvis");
}
रिफ्लेक्शन हेरफेर के अलावा, यह विधि यह सुनिश्चित करती है कि यह पूरे सिस्टम में अद्वितीय है। बस क्षेत्र को निजी में बदल दिया गया है, और ऑब्जेक्ट रिटर्न स्थिर फ़ैक्टरी विधि द्वारा किया जाता है।
- लाभ
- API को बदले बिना सिंगलटन को गैर-सिंगलटन में बदला जा सकता है।
- उदाहरण के लिए, स्थिर फ़ैक्टरी विधि प्रति थ्रेड एक अलग उदाहरण वापस कर सकती है।
- आप चाहें तो एक सामान्य सिंगलटन फ़ैक्टरी विधि में बदल सकते हैं।
- स्थिर फ़ैक्टरी के तरीके के संदर्भ को एक आपूर्तिकर्ता के रूप में इस्तेमाल किया जा सकता है।
- उदाहरण के लिए, आप Elvis::getInstance के बजाय Supplier<Elvis> का उपयोग कर सकते हैं।
- API को बदले बिना सिंगलटन को गैर-सिंगलटन में बदला जा सकता है।
यदि आप इन लाभों का उपयोग नहीं करने जा रहे हैं, तो पहला तरीका बेहतर है।
एनुम प्रकार का प्रयोग करना
public enum Elvis {
INSTANCE;
public void speak() {
System.out.println("elvis");
}
एनुम प्रकार का उपयोग करना सबसे अच्छा तरीका है। ऊपर दिए गए दो तरीकों की तुलना में, यह रिफ्लेक्शन हमलों के लिए भी सुरक्षित है और कोड साफ है। इसके अलावा, जैसा कि नीचे बताया गया है, ऊपर दिए गए दो तरीकों को सीरियलाइज़ करते समय अतिरिक्त कोड जोड़ने की आवश्यकता होती है।
हालांकि, ध्यान दें कि जबकि सिंगलटन को इंटरफ़ेस विरासत में मिल सकती है, यह वर्गों को विरासत में नहीं मिल सकता है।
सिंगलटन वर्गों को सीरियलाइज़ करते समय सावधानियां
यदि आप पहले या दूसरे तरीके से बनाए गए सिंगलटन वर्ग को सीरियलाइज़ करना चाहते हैं, तो आपको बस Serializable को लागू करने से अधिक करने की आवश्यकता है, आपको सभी इंस्टेंस फ़ील्ड को क्षणिक घोषित करना होगा और readResolve() विधि को ओवरराइड करके प्रदान करना होगा।
private Object readResolve throws ObjectStreamException {
return INSTANCE;