स्थिर वर्ग और सिंगलटन पैटर्न के बीच अंतर?


1767

स्थैतिक वर्ग और एक एकल पैटर्न के बीच क्या वास्तविक (यानी व्यावहारिक) अंतर मौजूद है?

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


4
भाषा के कार्यान्वयन और आपके उपयोग के पैटर्न के आधार पर, एक सिंगेलटन हर बार जब आप इसका उपयोग करना चाहते हैं , तो विधि को कॉल करने के कारण कम कुशल हो सकताgetInstance() है (हालांकि शायद ज्यादातर मामलों में यह कोई फर्क नहीं पड़ता )।
बहुत ज्यादा php

5
पहले से ही बहुत सारे उत्तर हैं। यह वास्तव में एक ऐसी singletonवस्तु है जहां staticविधियां सिर्फ एक कार्य है, एक गैर-ओओ इकाई।
फास्टकोडजवा

4
लागू होने पर निर्भर करता है .. csharpindepth.com/Articles/General/Singleton.aspx
VJAI

4
जब आप तृतीय पक्षों को वर्ग के कार्यान्वयन की आपूर्ति करने की अनुमति देना चाहते हैं तो एक अंतर होता है। इस मामले में आपको आमतौर पर एक फैक्टरी पैटर्न की आवश्यकता होती है। देखें agiletribe.wordpress.com/2013/10/08/...
AgilePro

IMO इस उत्तर को बहुत अच्छी तरह से stackoverflow.com/questions/14097656/…
डेव

जवाबों:


1251

आप क्या कहते हैं कि या तो एक सिंगलटन या एक स्थिर विधि थ्रेड-सुरक्षित नहीं है? आमतौर पर दोनों को थ्रेड-सुरक्षित होने के लिए लागू किया जाना चाहिए

एक सिंगलटन और स्टैटिक तरीकों के एक समूह के बीच बड़ा अंतर यह है कि सिंगलटन इंटरफेस को लागू कर सकते हैं (या उपयोगी बेस कक्षाओं से प्राप्त कर सकते हैं, हालांकि यह मेरे अनुभव में कम है), इसलिए आप सिंगलटन के चारों ओर से गुजर सकते हैं जैसे कि "बस एक और" “क्रियान्वयन।


29
ठीक है, अगर आप इसे पसंद करते हैं, तो न तो स्वाभाविक रूप से थ्रेडसेफ़ हैं, आपको उन्हें थ्रेडसेफ़ बनाना होगा, दोनों को, इसलिए वहां बहुत अंतर है।
जॉर्ज कॉर्डोबा

119
आप जो कुछ का एक उदाहरण दे सकते हैं है स्वाभाविक threadsafe, अपरिवर्तनीय प्रकार के अलावा अन्य?
जॉन स्कीट

26
स्कीट करने के लिए: लोग कहते हैं कि सिंगलटन थ्रेडसेफ़ नहीं है, इसका मतलब यह है कि एक सिंगलटन धागे के बीच अनावश्यक रूप से हर समय साझा किया जाता है , जबकि स्टैक ऑब्जेक्ट्स साझा किए जाते हैं जब आपको उनकी आवश्यकता होती है, जिसका अर्थ है कि आपको अनावश्यक सिंक्रनाइज़ेशन करने की आवश्यकता नहीं है।

45
@ गीक: कल्पना कीजिए कि सिंगलटन एक इंटरफ़ेस को लागू करता है Foo, और आपके पास Fooएक पैरामीटर के रूप में एक विधि है । उस सेटअप के साथ, कॉलर्स कार्यान्वयन के रूप में सिंगलटन का उपयोग करना चुन सकते हैं - या वे एक अलग कार्यान्वयन का उपयोग कर सकते हैं। विधि सिंगलटन से डिकॉय की जाती है। उस स्थिति से तुलना करें जहां कक्षा में केवल स्थिर विधियां हैं - कोड का प्रत्येक टुकड़ा जो उन तरीकों को कॉल करना चाहता है, उन्हें कसकर वर्ग में जोड़ा जाता है, क्योंकि यह निर्दिष्ट करने की आवश्यकता है कि किस वर्ग में स्थिर विधियां हैं।
जॉन स्कीट

10
@AmirBareket: यह सिंगलटन डिज़ाइन पैटर्न के अनुसार एक सिंगलटन नहीं है - यदि वर्ग स्वयं कई उदाहरणों को बनाने की अनुमति देता है, तो यह एक सिंगलटन IMO नहीं है, चाहे वह किसी भी कारखाने का हो।
जॉन स्कीट

475

सच्चा जवाब जॉन स्कीट ने यहां एक और मंच पर दिया है

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

एक स्थिर वर्ग केवल स्थिर विधियों की अनुमति देता है।


64
आप एक सिंगलटन को एक पैरामीटर के रूप में क्यों पारित करेंगे, हालांकि, यदि आप स्थैतिक getInstance () पद्धति को कॉल करके उसी उदाहरण को कहीं से भी एक्सेस कर सकते हैं?
हेनरिक ऑर्डिन

23
@ हेनरिकऑर्डिन तो यह मौजूदा कोड में फिट हो सकता है और एक इंटरफ़ेस प्रदान कर सकता है?

6
@ हेनरिकऑर्डिन वे स्टैटिक क्लास के बारे में बोल रहे हैं, स्टैटिक मेथड्स वाली क्लास नहीं। स्टेटिक क्लास को तत्काल नहीं किया जा सकता है। फिर भी, यदि आप एक (गैर-स्थैतिक) वर्ग का उदाहरण देते हैं जिसमें स्थिर विधियाँ हैं, तो आप स्थैतिक विधियों को उदाहरण पर नहीं कह सकते।
गोरान

3
स्टैटिक क्लास क्या है? कम से कम जावा में, ऐसी कोई बात नहीं है।
हेनरिक ऑर्डिन

16
@ गोरान मैं शुरू में आपके शब्दों से बहुत उलझन में था। आपने कहा "आप एक उदाहरण पर स्थिर तरीके नहीं कह सकते हैं"। मैंने पढ़ा कि "यदि आपके पास एक तात्कालिक वस्तु का संदर्भ है, तो आप किसी भी स्थिर तरीके को कॉल नहीं कर सकते हैं।" वह गलत है। इसे फिर से पढ़ने के बाद कुछ बार मुझे लगता है कि आपका मतलब "अंदर के स्थिर तरीकों से आप कक्षा में गैर-स्थिर वस्तुओं तक नहीं पहुंच सकते हैं" जो सही है। स्पष्ट करना चाहते हैं कि इन अवधारणाओं में से किसी के लिए जो इस उत्तर में आता है और आपकी टिप्पणियों को पढ़ता है।
एंड्रयू स्टिट्ज

359
  1. सिंगलटन ऑब्जेक्ट्स को हीप में संग्रहीत किया जाता है , लेकिन स्टैटिक ऑब्जेक्ट्स को स्टैक में संग्रहीत किया जाता है ।
  2. हम क्लोन कर सकते हैं (यदि डिजाइनर ने इसे अस्वीकार नहीं किया है) सिंगलटन ऑब्जेक्ट, लेकिन हम स्थिर क्लास ऑब्जेक्ट को क्लोन नहीं कर सकते।
  3. सिंगलटन कक्षाएं OOP (ऑब्जेक्ट ओरिएंटेड सिद्धांतों) का पालन करती हैं , स्थिर कक्षाएं नहीं करती हैं।
  4. हम interfaceएक सिंगलटन वर्ग के साथ लागू कर सकते हैं , लेकिन एक कक्षा के स्थिर तरीके (या उदाहरण के लिए एक C # static class) नहीं कर सकते।

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

19
यह उत्तर जावा के लिए सही नहीं है: न तो सिंगलटन और न ही स्टैटिक स्टैक का उपयोग करता है।
एजिलप्रो

72
# 1 महत्वपूर्ण नहीं है। # 2 एक दोषपूर्ण कार्यान्वयन का वर्णन करता है। # 3 पूरी तरह से अनुचित है।
केसी

31
स्टैटिक ऑब्जेक्ट को स्टैक में कैसे संग्रहीत किया जा सकता है? नया स्टैक फ्रेम तब बनाया जाता है जब आप किसी विधि को आमंत्रित करते हैं, यह विधि के स्थानीय चरों को संग्रहीत करता है, विधि के वापस आने पर यह स्टैक फ्रेम हटा दिया जाता है, और उन स्थानीय चर खो जाते हैं। निश्चित स्टैक तेज है, लेकिन यह स्थिर वस्तुओं को संग्रहीत करने के लिए उपयुक्त नहीं है।
mike_m

23
मैं इस पर upvotes की संख्या को नहीं समझ सकता। 1) सिंगलटन को स्टैक में क्यों रखा जाना चाहिए? प्रबंधित भाषाओं में जैसे C # या Java डेटा स्थानीय विधि चर / मापदंडों को छोड़कर, प्रबंधित ढेर में संग्रहीत किया जाता है। 2) यदि आप इसे क्लोन कर सकते हैं, तो यह ठीक से लागू सिंगनल नहीं है। 3) सिंगलटन को ओओपी विरोधी पैटर्न के रूप में जाना जाता है; यानी कुछ ऐसा जो आपको संभव हो तो टालना चाहिए। 4) यह केवल एक चीज है जो सही है।
Groo

152

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


10
अच्छे, व्यावहारिक बिंदुओं के लिए +1। सिंगलटन पैटर्न का सामान्य रूप से उपयोग किया जाता है, लेकिन कुछ स्थितियां ऐसी हैं जहां यह उपयुक्त है। इसे भी देखें: agiletribe.wordpress.com/2013/10/08/…
AgilePro

3
आप बहुरूपी होने के लाभ के बारे में सही हैं। यह सबसे महत्वपूर्ण बिंदु है
अहमद

नेस्टेड स्थिर वर्ग इंटरफ़ेस को लागू कर सकता है। इसे कोड करने की कोशिश करें, काम करेगा। मैं बिना किसी त्रुटि के कोड संकलित कर सकता हूं।
नैनोसॉफ्ट

75

staticकक्षाएं किसी भी चीज के लिए नहीं होती हैं, जिन्हें राज्य की आवश्यकता होती है। यह एक साथ कार्यों का एक गुच्छा लगाने के लिए उपयोगी है यानी Math(याUtils परियोजनाओं में) । इसलिए कक्षा का नाम हमें केवल एक सुराग देता है जहां हम कार्यों को पा सकते हैं और इससे अधिक कुछ नहीं।

Singletonमेरा पसंदीदा पैटर्न है और मैं इसे एक बिंदु पर कुछ प्रबंधित करने के लिए उपयोग करता हूं। यह staticकक्षाओं की तुलना में अधिक लचीला है और यह राज्य बनाए रख सकता है। यह इंटरफेस को लागू कर सकता है, अन्य वर्गों से विरासत में मिला है और विरासत की अनुमति दे सकता है।

के बीच चुनने के लिए मेरा नियम staticऔर singleton:

यदि कार्यों का एक गुच्छा है जिसे एक साथ रखा जाना चाहिए, तो staticविकल्प है। कुछ और जो कुछ संसाधनों तक एकल पहुंच की आवश्यकता है, को एक के रूप में लागू किया जा सकता है singleton


16
राज्य को बचाने के लिए स्थिर वर्गों को कुछ भी क्यों नहीं करना चाहिए?
ट्रिस्पेड

12
@ छंटनी: आपका आरंभिक और न ही अंतिमकरण पर सटीक नियंत्रण है।
ज़ाक्रोन

7
आपने मुझे "सिंगलटन मेरा पसंदीदा पैटर्न" कहा है। सिंगलटन एक ऐसा तेज कोना है जिसे एक पैटर्न के साथ-साथ एक विरोधी पैटर्न भी माना जाना चाहिए। क्लास में स्टेटिक स्टेट्स अच्छी तरह से हो सकते हैं, यह भी सिंगल एक्सेस है, अगर कुछ भी स्टैटिक स्टेट सिंगलनेट्स की तुलना में अधिक "सिंगल एक्सेस" है क्योंकि ज्यादातर सिंगलटन इम्प्लीमेंटेशन टूट गए हैं। आप सिंगलटन को क्लोन कर सकते हैं, जबकि स्टैटिक को विशिष्ट होने की परिभाषा से आशीर्वाद मिलता है।
PoweredByRice

1
राज्य बनाए रखने का क्या मतलब है? राज्य क्या है?
काइल डेलाने

2
@ काइलडेलन: बस Stateएक वस्तु के विभिन्न गुणों का संयोजन है जो आमतौर पर समय के साथ बदलते हैं। आप औपचारिक परिभाषा के लिए Google कर सकते हैं।
Xaqron

65

स्टेटिक क्लास: -

  1. आप स्थिर वर्ग का उदाहरण नहीं बना सकते।

  2. .NET फ्रेमवर्क सामान्य भाषा रनटाइम (CLR) द्वारा स्वचालित रूप से लोड किया जाता है, जब प्रोग्राम या नामस्थान वर्ग युक्त होता है।

  3. स्टेटिक क्लास में कंस्ट्रक्टर नहीं हो सकता है।

  4. हम स्टैटिक क्लास को मेथड में पास नहीं कर सकते।

  5. हम स्टेटिक क्लास को C # में किसी अन्य स्टेटिक क्लास से वारिस नहीं कर सकते।

  6. सभी स्थिर विधियों वाला एक वर्ग।

  7. बेहतर प्रदर्शन (स्थिर तरीकों का संकलन समय पर किया जाता है)

सिंगलटन: -

  1. आप ऑब्जेक्ट का एक उदाहरण बना सकते हैं और उसका पुन: उपयोग कर सकते हैं।

  2. उपयोगकर्ता द्वारा अनुरोध किए जाने पर पहली बार सिंगलटन इंस्टेंस बनाया जाता है।

  3. सिंगलटन क्लास में कंस्ट्रक्टर हो सकते हैं।

  4. आप सिंगलटन क्लास का ऑब्जेक्ट बना सकते हैं और इसे विधि में पास कर सकते हैं।

  5. सिंगलटन वर्ग इनहेरिटेंस का कोई प्रतिबंध नहीं कहता है।

  6. हम एक एकल वर्ग की वस्तुओं का निपटान कर सकते हैं लेकिन स्थिर वर्ग का नहीं।

  7. तरीकों को ओवरराइड किया जा सकता है।

  8. आवश्यकता होने पर आलसी लोड किया जा सकता है (स्थिर वर्ग हमेशा लोड होते हैं)।

  9. हम इंटरफ़ेस लागू कर सकते हैं (स्थिर वर्ग इंटरफ़ेस को लागू नहीं कर सकता है)।


13
स्टैटिक क्लासेस में कंस्ट्रक्टर होते हैं: msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
Tomer Arazy

2
हां, स्थैतिक में कंस्ट्रक्टर हो सकता है जो उस वर्ग के लिए आंतरिक हो। यह तब हो जाता है जब कक्षा में किसी भी स्थिर विधि को बुलाया जाता है।
रहुलम्र

संकलित समय पर सिंगलटन के लिए, इसे HEAP मेमोरी में संग्रहित किया जाता है, लेकिन अगर इसे STACK में संग्रहीत किया जाता है, तो यह तुरंत हो जाता है?
Luminous_Dev

@Luminous_Dev नहीं। किसी भी एकल उदाहरण का दिन के अंत में एक वस्तु उदाहरण है। यह बिना किसी संदेह के ढेर पर जमा हो जाएगा।
RBT

1
@ अरुलम्र महत्वपूर्ण अंतर: निर्माणकर्ता को पहले (AKA केवल) उदाहरण से पहले इनवाइट किया जाता है।
कूल ओप्पो

53

एक स्थिर वर्ग वह है जिसमें केवल स्थिर विधियाँ होती हैं, जिसके लिए एक बेहतर शब्द "कार्य" होगा। एक स्थिर वर्ग में सन्निहित डिजाइन शैली पूरी तरह से प्रक्रियात्मक है।

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


1
बहुरूपता

32
तुमने यह सोचा। मैं अलग तरह से सोचता हूं। ;) उदाहरण के लिए, एक सिंगलटन फैक्ट्री की कल्पना करें जो एक इंटरफ़ेस लौटाती है। तुम्हें पता है कि तुम एक ISingleton हो रही है (और यह हमेशा के लिए एक ही है) लेकिन जरूरी नहीं कि जो कार्यान्वयन हो।
Morendil

नेस्टेड स्टैटिक क्लास के पास इंस्टेंस मेथड्स हो सकते हैं, केवल स्टैटिक मेथड्स तक ही सीमित नहीं है। इसे कोड करें और आप देख सकते हैं।
नैनोसॉफ्ट

एक अच्छे ऑब्जेक्ट मॉडल (उदाहरण के लिए रूबी) वाली भाषाओं में, कक्षाएं भी ऑब्जेक्ट हैं। एक स्थिर वर्ग का "विशुद्ध रूप से प्रक्रियात्मक" पहलू भाषा द्वारा लगाया गया एक मनमाना प्रतिबंध है।
मैक्स

36

सिंगलटन पैटर्न में आप एकल प्रकार के उदाहरण के रूप में सिंगलटन बना सकते हैं, आप एक स्थिर वर्ग के साथ ऐसा नहीं कर सकते।

त्वरित उदाहरण:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

39
यह वास्तव में एक सिंगलटन पैटर्न नहीं है, मेरे लिए कारखाने की तरह दिखता है।
vava

10
वास्तव में, दोनों के बीच मूलभूत अंतर यह है कि सिंगलटन अपनी एकल वस्तु को "कैश" करेगा और उसी को वापस लौटाएगा (एक संदर्भ)। फैक्टरी पैटर्न नए उदाहरण पैदा करेगा।
फकीर

12
फिर यह प्रॉक्सी-सिंगलटन :)
vava

3
हम्म, मैं सिंगलटन की इस किस्म को मोनोस्टेट के रूप में जानता हूं।
हूपी

उदाहरण फैक्टरी पैटर्न है
राजावेल डी

26

जॉन स्कीट के उत्तर पर विस्तार करने के लिए

एक सिंगलटन और स्टैटिक तरीकों के एक समूह के बीच बड़ा अंतर यह है कि सिंगलटन इंटरफेस (या उपयोगी आधार वर्गों से प्राप्त कर सकते हैं, हालांकि यह कम आम आईएमई है), इसलिए आप सिंगलटन के चारों ओर से गुजर सकते हैं जैसे कि यह "सिर्फ एक और कार्यान्वयन" था।

जब एक कक्षा का परीक्षण किया जाता है, तो एकल के साथ काम करना आसान होता है। जहाँ भी आप एक पैरामीटर (कंस्ट्रक्टर, सेटर या मेथड) के रूप में सिंग्लेटन्स पास करते हैं, आप इसके बजाय सिंगलटन के नकली या स्टबड संस्करण को स्थानापन्न कर सकते हैं।


मुझे नहीं लगता कि आप सीधे एक सिंगलटन का मजाक उड़ा सकते हैं। क्या आपको ऐसा इंटरफ़ेस घोषित नहीं करना पड़ेगा जो सिंगलटन और मॉक क्लास दोनों पर लागू हो?
एलेन स्पार्टस

क्यों आप अपने सिंगलटन का मजाक नहीं उड़ा सकते? मॉकिटो का उपयोग कर उदाहरण MySingleton mockOfMySingleton = mock(MySingleton.class)
माइक रायलैंडर

आप सही हैं, आप इसे मॉकिटो जैसे उपकरणों के साथ मॉक कर सकते हैं जो प्रतिबिंब का उपयोग करते हैं। मेरा मतलब था कि आप इसे सीधे तौर पर उप-केंद्रित करके और इसके तरीकों को ओवरराइड करके इसका मजाक नहीं उड़ा सकते।
एलेन स्पर्टस

@ एस्पर्टस क्यों नहीं? जब आप जिस वस्तु का परीक्षण कर रहे हैं, उसे आप अपने सिंग्लटन के उपवर्ग कार्यान्वयन के स्थान पर ले जा सकते हैं, जहाँ भी आपने मूल का उपयोग किया होगा, उसे तुरंत रद्द कर दें। Ex:new ClazzToTest(mockSingleton);
माइक रायलैंडर

मैंने मॉकिटो का उपयोग नहीं किया है, लेकिन आप एक वर्ग का उपवर्ग कैसे बना सकते हैं, जिसमें एक निजी निर्माता है, जो प्रतिबिंब का उपयोग करके, एकल के लिए मामला है? संबंधित चर्चाएँ: stackoverflow.com/questions/2302179/mocking-a-singleton-class stackoverflow.com/questions/15939023/…
एलेन स्पार्टस

23

यहाँ एक अच्छा लेख है: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

स्थिर वर्ग

एकाकी वस्तु

सारांश में, मैं केवल उपयोग के तरीकों को रखने के लिए स्थिर कक्षाओं का उपयोग करूंगा, और बाकी सब चीजों के लिए सिंगलटन का उपयोग करूंगा।


संपादित करता


4
मैं जावा के बारे में नहीं जानता, लेकिन। नेट में, आपके अंतिम दो अंक गलत हैं। स्टेटिक क्लास स्टेटिक प्रॉसेस और फील्ड्स को संदर्भित कर सकते हैं, इसलिए राज्य पर वे समान हैं। और वे आलसी लोड किए गए हैं - स्थिर निर्माणकर्ता तब चलाया जाता है जब: 1) वर्ग का एक उदाहरण बनाया जाता है। 2) वर्ग के किसी भी स्थिर सदस्य को संदर्भित किया जाता है। 1 लागू नहीं होता है, जो 2 छोड़ता है। इसलिए, पहली बार उपयोग किए जाने तक एक स्थिर वर्ग लोड नहीं होता है।
जमरनो

1
स्टैटिक क्लास के लिए, हालाँकि आप स्टैटिक मेथड को ओवरराइड नहीं कर सकते हैं, आप स्टैटिक मेथड को उसके पेरेंट से छिपा सकते हैं।
मैक्स पेंग

अगर होता है Animal animal = new Cat();तो animal.foo();क्या होता है
Luminous_Dev

@jmoreno स्थिर वर्ग पहली बार उपयोग करने तक लोड नहीं किया जाता है? मेरा मानना ​​है कि यह संकलन समय पर स्टैक मेमोरी में संग्रहीत है। और यह तुरंत पहुँचा है .. यह नहीं है?
Luminous_Dev

@Luminous_Dev: कम से कम .net के लिए, एक स्टैटिक क्लास में एक कंस्ट्रक्टर होता है जो पहली बार एक्सेस करने पर चलता है, इसलिए नहीं यह तुरंत एक्सेस नहीं होता है। स्थिर निर्माणकर्ता सिद्धांत में समय की एक अनबिके राशि ले सकता है। जहां यह (या कोई अन्य वर्ग संग्रहीत है) एक कार्यान्वयन विवरण है, जो वास्तव में इस प्रश्न के लिए प्रासंगिक नहीं है।
1

22

एक सिंगलटन का एक अन्य लाभ यह है कि इसे आसानी से क्रमबद्ध किया जा सकता है, जो आवश्यक हो सकता है यदि आपको इसकी स्थिति को डिस्क पर सहेजने की आवश्यकता है, या इसे कहीं दूर भेजना है।


19

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

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

संपादित करें:
मैं वास्तव में अब सोच रहा हूं कि एक और अंतर यह है कि एक स्टैटिक क्लास का तात्कालिकता है प्रोग्राम प्रारंभ * पर किया और कार्यक्रम के पूरे जीवन काल में रहता है, जबकि एक सिंगलटन स्पष्ट रूप से किसी बिंदु पर त्वरित रूप से त्वरित होता है और इसे नष्ट भी किया जा सकता है।

* या यह प्रथम उपयोग पर तत्काल किया जा सकता है, भाषा के आधार पर, मुझे लगता है।


15
हां, बाकी सभी इस तथ्य को नजरअंदाज करते नजर आते हैं कि स्थिर विधियों वाले एक वर्ग के पास निजी स्थिर क्षेत्र भी हो सकते हैं, जिसे वह अभी भी राज्य बनाए रखने के लिए उपयोग कर सकता है (और उनमें से कुछ को सार्वजनिक स्थैतिक बसाने / पाने वालों के माध्यम से ग्राहक कोड में उजागर कर सकता है)।
user289463

17

जॉन की बात को स्पष्ट करने के लिए कि लकड़हारा एक स्थिर वर्ग था, तो नीचे क्या नहीं किया जा सकता है। वर्ग SomeClassउम्मीद करता है कि ILoggerकार्यान्वयन का एक उदाहरण इसके निर्माता में पारित किया जाएगा।

संभव होने के लिए निर्भरता इंजेक्शन के लिए सिंगलटन क्लास महत्वपूर्ण है।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var someClass = new SomeClass(Logger.GetLogger());
        }


    }

    public class SomeClass 
    {
        public SomeClass(ILogger MyLogger)
        {

        }
    }

    public class Logger : ILogger
    {
        private static Logger _logger;
        private Logger() { }

        public static Logger GetLogger()
        {
            if (_logger==null)
            {
                _logger = new Logger();
            }

            return _logger;
        }

        public void Log()
        {

        }

    }


    public interface ILogger
    {
         void Log();
    }
}

13

वैसे एक सिंगलटन सिर्फ एक सामान्य वर्ग है जो आईएस पर त्वरित और केवल एक बार और परोक्ष रूप से क्लाइंट कोड से है। स्टेटिक क्लास को तत्काल नहीं किया जाता है। जहाँ तक मुझे पता है कि स्टैटिक विधियाँ (स्टैटिक क्लास में स्टैटिक विधियाँ होनी चाहिए) गैर-स्टैटिक से अधिक तेज़ हैं।

संपादित करें:
FxCop प्रदर्शन नियम विवरण: "ऐसे तरीके जो इंस्टेंस डेटा या कॉल इंस्टेंस विधियों तक नहीं पहुंचते हैं, उन्हें स्टैटिक (VB में साझा) के रूप में चिह्नित किया जा सकता है। ऐसा करने के बाद, कंपाइलर इन सदस्यों के लिए गैर-आभासी कॉल साइटों का उत्सर्जन करेगा जो इसे रोकेंगे। प्रत्येक कॉल के लिए रनटाइम पर जांच करें जो कि वर्तमान ऑब्जेक्ट पॉइंटर को इंश्योर करता है, यह अशक्त है। इसके परिणामस्वरूप प्रदर्शन-संवेदनशील कोड के लिए औसत दर्जे का प्रदर्शन लाभ हो सकता है। कुछ मामलों में, वर्तमान ऑब्जेक्ट इंस्टेंस तक पहुंचने में विफलता एक शुद्धता मुद्दे का प्रतिनिधित्व करती है। "
मैं वास्तव में यह नहीं जानता कि क्या यह स्थिर वर्गों में स्थिर तरीकों पर भी लागू होता है।


11

सिंगलटन का त्वरित रूप से उपयोग किया जाता है, यह सिर्फ एक ही उदाहरण है जो कभी भी त्वरित होता है, इसलिए सिंगलटन में एकल

एक स्थिर वर्ग को स्वयं के अलावा किसी अन्य चीज से त्वरित नहीं किया जा सकता है।


जावा में स्टेटिक क्लास को बहुत इंस्टेंट किया जा सकता है। Docs.oracle.com/javase/tutorial/java/javaOO/nested.html पढ़ें। मेरे उत्तर का उल्लेख करें stackoverflow.com/a/37114702/1406510
nanosoft

8

मुख्य अंतर हैं:

  • सिंगलटन में एक उदाहरण / वस्तु होती है जबकि स्थिर वर्ग स्थैतिक विधियों का एक समूह होता है
  • सिंगलटन को एक इंटरफेस के माध्यम से बढ़ाया जा सकता है जबकि स्थिर वर्ग नहीं हो सकता है।
  • सिंगलटन को विरासत में मिला जा सकता है, जो दूसरी ओर स्थिर वर्ग में SOLID सिद्धांतों में खुले / निकट सिद्धांतों का समर्थन करता है, उन्हें विरासत में नहीं मिला जा सकता है और हमें अपने आप में बदलाव करने की आवश्यकता है।
  • सिंगलटन ऑब्जेक्ट को विधियों में पास किया जा सकता है जबकि स्थिर वर्ग के पास यह नहीं है कि उदाहरण के लिए पैरामीटर के रूप में पारित नहीं किया जा सकता है

7

परीक्षण के दृष्टिकोण से सिंगलटन बेहतर दृष्टिकोण है। स्थिर वर्गों के विपरीत, सिंगलटन इंटरफेस को लागू कर सकते हैं और आप मॉक इंस्टेंस का उपयोग कर सकते हैं और उन्हें इंजेक्ट कर सकते हैं।

नीचे दिए गए उदाहरण में मैं इसका उदाहरण दूंगा। मान लें कि आपके पास एक विधि है GoodPrice () जो विधि getPrice () का उपयोग करती है और आप getPrice () को एक सिंगलटन में एक विधि के रूप में लागू करते हैं।

सिंगलटन जो प्रदान करता है GetPrice कार्यक्षमता:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

GetPrice का उपयोग:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

अंतिम सिंगलटन कार्यान्वयन:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

परीक्षण वर्ग:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

यदि हम getPrice () को लागू करने के लिए स्थैतिक विधि का उपयोग करने का विकल्प लेते हैं, तो यह getPrice () के लिए कठिन था। आप पावर मॉक के साथ स्थैतिक का मज़ाक उड़ा सकते हैं, फिर भी सभी उत्पाद इसका उपयोग नहीं कर सकते।


1
अब यह थ्रेड सुरक्षित नहीं है, और आमतौर पर इंटरफ़ेस के कार्यान्वयन के संदर्भ में बुरा है। यकीन है, एक इंटरफ़ेस होने से परीक्षण करने के लिए अच्छा है - लेकिन फिर एक सिंगलटन के साथ परेशान क्यों? बस एक सिंगलटन होने से बचें; उत्पादन उद्देश्यों के लिए इसे लागू करने वाला एक वर्ग है, परीक्षण प्रयोजनों के लिए एक कार्यान्वयन, और जो आप कर रहे हैं उसके आधार पर सही उदाहरण इंजेक्ट करें। अपने कॉल करने के लिए सिंगलटन को युगल करने की कोई आवश्यकता नहीं है।
जॉन स्कीट

प्रतिक्रिया के लिए धन्यवाद। यह धागे को सुरक्षित बनाने के लिए बहुत सरल है। इसके अलावा, मैं कैशिंग उद्देश्य के लिए सिंगलटन का उपयोग करता हूं।
आमिर बरेकेट

1
हां, हालांकि व्यर्थ ओवरहेड के साथ। फिर, यह सिर्फ एक सिंगलटन का उपयोग न करने के लिए सरल है।
जॉन स्कीट

6

मैं इस परिभाषा से सहमत हूँ:

शब्द " एकल " का अर्थ है आवेदन जीवन चक्र के दौरान एकल वस्तु, इसलिए गुंजाइश आवेदन स्तर पर है।

स्थिर तो गुंजाइश अनुप्रयोग डोमेन के स्तर पर है, किसी भी वस्तु सूचक नहीं है।

इसके अलावा दोनों को थ्रेड-सुरक्षित होने के लिए लागू किया जाना चाहिए।

आप इसके बारे में दिलचस्प अन्य अंतर पा सकते हैं: सिंगलटन पैटर्न वर्सस स्टेटिक क्लास


5

एक उल्लेखनीय अंतर सिंटलेट्स के साथ आने वाले इंस्टेंटेशन का अंतर है।

स्थैतिक कक्षाओं के साथ, यह सीएलआर द्वारा बनाया जाता है और इस पर हमारा नियंत्रण नहीं है। एकल के साथ, ऑब्जेक्ट को उस तक पहुंचने की कोशिश की जाने वाली पहली आवृत्ति पर त्वरित हो जाता है।


4

कई मामलों में, इन दोनों में कोई व्यावहारिक अंतर नहीं है, खासकर अगर सिंगलटन उदाहरण कभी नहीं बदलता है या बहुत धीरे-धीरे बदलता है जैसे कि कॉन्फ़िगरेशन पकड़ना।

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

किसी और ने पहले उल्लेख किया है कि एक स्थिर वर्ग विशुद्ध रूप से प्रक्रियात्मक होना चाहिए जैसे java.lang.Math। मेरे दिमाग में, इस तरह के वर्ग को कभी भी पास नहीं होना चाहिए और उन्हें कभी भी स्टैटिस्टिकल फाइनल के अलावा और कुछ नहीं रखना चाहिए। बाकी सब कुछ के लिए, एक सिंगलटन का उपयोग करें क्योंकि यह बहुत अधिक लचीला और बनाए रखने में आसान है।


4

हमारे पास हमारा डीबी फ्रेमवर्क है जो बैक एंड से कनेक्शन बनाता है। डर्टी अवॉइड से बचें कई उपयोगकर्ताओं के बीच हमने सिंगलटन पैटर्न का उपयोग किया है ताकि यह सुनिश्चित हो सके कि हमारे पास किसी भी समय उपलब्ध एकल उदाहरण है।

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

सिंगलटन स्टेटलेस परिदृश्यों में स्थिति बनाए रखने का एक तरीका प्रदान करता है

आशा है कि आपकी मदद करता है ..


3
  1. धीरे लोड हो रहा है
  2. इंटरफेस का समर्थन, ताकि अलग से कार्यान्वयन प्रदान किया जा सके
  3. व्युत्पन्न प्रकार लौटने की क्षमता (आलसी लोडिंग और इंटरफ़ेस कार्यान्वयन के संयोजन के रूप में)

नेस्टेड स्टैटिक क्लास जावा में इंटरफेस को बहुत ज्यादा लागू कर सकता है। आपका दूसरा बिंदु गलत है।
नैनोसॉफ्ट

3

ए। सीरियलाइजेशन - स्टैटिक सदस्य वर्ग के हैं और इसलिए इसे क्रमबद्ध नहीं किया जा सकता है।

ख। हालांकि हमने कंस्ट्रक्टर को निजी बना दिया है, फिर भी स्थैतिक सदस्य चर को उपवर्ग में ले जाया जाएगा।

सी। हम आलसी इनिशियलाइज़ेशन नहीं कर सकते हैं क्योंकि सब कुछ केवल क्लास लोडिंग पर लोड किया जाएगा।


3

क्लाइंट के नजरिए से, स्थिर व्यवहार क्लाइंट के लिए जाना जाता है, लेकिन सिंगलटन व्यवहार को क्लाइंट से छिपाया जा सकता है। क्लाइंट को कभी नहीं पता हो सकता है कि केवल एक ही उदाहरण वह बार-बार साथ खेल रहा है।


3

मैं निम्नलिखित पढ़ता हूं और सोचता हूं कि यह भी समझ में आता है:

आपके व्यवसाय का ख्याल करना

याद रखें, सबसे महत्वपूर्ण OO नियमों में से एक यह है कि एक वस्तु स्वयं के लिए जिम्मेदार है। इसका अर्थ यह है कि वर्ग के जीवन चक्र से संबंधित मुद्दों को कक्षा में संभाला जाना चाहिए, न कि स्थैतिक जैसे भाषा निर्माणों को सौंप दिया जाए, इत्यादि।

आब्जेक्ट ओरिएंटेड थॉट प्रोसेस 4th एड नामक पुस्तक से।


मैं असहमत हूं, क्योंकि यह वास्तव में वर्ग के लिए एक जिम्मेदारी जोड़ता है, जो (यह मानते हुए कि कुछ भी करता है) का अर्थ है कि यह अब एकल जिम्मेदारी सिद्धांत का उल्लंघन करता है।
ssmith

3

एक लेख में मैंने लिखा कि मैंने अपनी बात का वर्णन किया है कि एकल वर्ग एक स्थिर वर्ग की तुलना में बेहतर क्यों है:

  1. स्टेटिक क्लास वास्तव में कैनोनिकल क्लास नहीं है - यह फ़ंक्शन और चर के साथ एक नाम स्थान है
  2. ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सिद्धांतों को तोड़ने के कारण स्थिर वर्ग का उपयोग करना एक अच्छा अभ्यास नहीं है
  3. स्टेटिक क्लास को अन्य के लिए एक पैरामीटर के रूप में पारित नहीं किया जा सकता है
  4. स्टेटिक क्लास "आलसी" आरंभीकरण के लिए उपयुक्त नहीं है
  5. स्थैतिक वर्ग का प्रारंभिक उपयोग और उपयोग करना हमेशा कठिन होता है
  6. धागा प्रबंधन को लागू करना कठिन है

मैं इसे अंग्रेजी व्याकरण के लिए तैयार करूंगा, लेकिन अन्यथा, यह एक दिलचस्प पढ़ा :) :)
Noctis

3
  1. हम सिंगलटन क्लास का ऑब्जेक्ट बना सकते हैं और इसे विधि में पास कर सकते हैं।

  2. सिंगलटन वर्ग वंशानुक्रम का कोई प्रतिबंध नहीं करता है।

  3. हम एक स्थिर वर्ग की वस्तुओं का निपटान नहीं कर सकते, लेकिन एकल वर्ग को कर सकते हैं।


एक सिंगलटन को एक विधि में पास करने का क्या उपयोग है यदि हमेशा एक ही होता है और एक हमेशा एक स्थिर संदर्भ होता है?
एरोन फ्रेंके

3

स्थिर वर्ग से भेद

JDK में सिंगलटन और स्टैटिक दोनों के उदाहरण हैं, एक ओर java.lang.Mathस्थिर विधियों के साथ अंतिम वर्ग है, दूसरी ओर java.lang.Runtimeएक एकल वर्ग है।

सिंगलटन के फायदे

  • यदि सिंगलटन पैटर्न की तुलना में आपकी स्थिति को बनाए रखने की आवश्यकता है, तो स्थिर वर्ग की तुलना में बेहतर विकल्प है, क्योंकि स्टेटिक क्लास में स्थिति बनाए रखने से कीड़े पैदा होते हैं, खासकर समवर्ती वातावरण में, जो कई थ्रेड्स द्वारा पर्याप्त सिंक्रनाइज़ेशन समानांतर संशोधन के बिना दौड़ की स्थिति पैदा कर सकता है।

  • यदि एक भारी वस्तु है, तो सिंगलटन क्लास को आलसी लोड किया जा सकता है, लेकिन स्थिर वर्ग के पास ऐसे फायदे नहीं हैं और हमेशा उत्सुकता से भरी हुई है।

  • सिंगलटन के साथ, आप बेस क्लास का विस्तार करने, इंटरफ़ेस लागू करने और विभिन्न कार्यान्वयन प्रदान करने के लिए विरासत और बहुरूपता का उपयोग कर सकते हैं।

  • चूंकि जावा में स्थिर तरीकों को ओवरराइड नहीं किया जा सकता है, इसलिए वे अनम्यता को जन्म देते हैं। दूसरी ओर, आप इसे विस्तारित करके सिंगलटन क्लास में परिभाषित विधियों को ओवरराइड कर सकते हैं।

स्थिर वर्ग के नुकसान

  • स्टैटिक क्लास की तुलना में सिंगलटन के लिए यूनिट टेस्ट लिखना ज्यादा आसान है, क्योंकि आप जब भी सिंगलटन की उम्मीद करते हैं तो मॉक ऑब्जेक्ट को पास कर सकते हैं।

स्थिर वर्ग के लाभ

  • स्टेटिक क्लास सिंगलटन की तुलना में बेहतर प्रदर्शन प्रदान करता है, क्योंकि स्टैटिक विधियाँ संकलन समय पर बंधी होती हैं।

फायदे और नुकसान के साथ हर एक सिंगलटन पैटर्न के कई अहसास हैं।

  • एगर लोडिंग सिंगलटन
  • डबल-चेकिंग लॉकिंग सिंगलटन
  • प्रारंभिक-ऑन-डिमांड धारक मुहावरे
  • एनम आधारित सिंगलटन

उनमें से प्रत्येक का विस्तृत विवरण बहुत अधिक है, इसलिए मैंने सिर्फ एक अच्छे लेख के लिए एक लिंक दिया है - आप सभी सिंगलटन के बारे में जानना चाहते हैं


2

एकल स्थिर वर्ग उदाहरण (अर्थात, किसी वर्ग का एकल उदाहरण, जो स्थिर या वैश्विक परिवर्तनशील होता है) और एकल स्थिर सूचक के बीच ढेर के वर्ग के उदाहरण में बहुत अंतर होता है :

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


1
तो अगर आवेदन बाहर निकलता है तो क्या सिंगलटन अभी भी स्मृति में रहेगा?
नैनोसॉफ्ट

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

2

मेरे सिर में अंतर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (सिंगलटन / प्रोटोटाइप) या फंक्शनल प्रोग्रामिंग (स्टेटिक) को लागू कर रहा है।

हम सिंगलटन पैटर्न द्वारा बनाई गई वस्तुओं की संख्या पर भी ध्यान केंद्रित करते हैं जब हमें जिस पर ध्यान केंद्रित करना चाहिए वह यह है कि अंत में हम एक वस्तु रखते हैं। जैसा कि दूसरों ने पहले ही कहा है, इसे बढ़ाया जा सकता है, एक पैरामीटर के रूप में पारित किया जा सकता है, लेकिन सबसे महत्वपूर्ण बात यह है कि यह राज्य से भरा है।

दूसरी ओर कार्यात्मक प्रोग्रामिंग को लागू करने के लिए स्थैतिक का उपयोग किया जाता है। स्थिर सदस्य एक वर्ग के होते हैं। वे स्टेटलेस हैं।

वैसे क्या आप जानते हैं कि आप सिंगलटन स्टैटिक क्लासेस बना सकते हैं :)


एक सिंगलटन को एक पैरामीटर के रूप में पारित करने का क्या मतलब है क्योंकि यह हमेशा क्लास पर एक स्थिर संदर्भ होता है?
आरोन फ्रेंके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.