2011-05-23 19 views
5

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

पारंपरिक सी में, स्थैतिक चर डेटा खंडों में संग्रहीत होते हैं और स्थानीय चर ढेर में संग्रहीत होते हैं। जो मैं मानता हूं, स्थानीय चर की तुलना में स्थिर चर को स्टोर और बनाए रखने के लिए अधिक महंगा बना देगा। सही?

जावा या सी # के संदर्भ में समझने की कोशिश करते समय, क्या सिंगलटन कक्षा की तुलना में यह स्थिर वर्गों के लिए लाभकारी होगा? चूंकि वर्ग की शुरुआत से पहले पूरी कक्षा को स्मृति में लोड किया गया है, इसलिए मुझे नहीं लगता कि यह तब तक लाभ कैसे प्राप्त हो सकता है जब तक हमारे पास छोटे इनलाइन-सक्षम फ़ंक्शंस न हों।

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

-Ivar

उत्तर

7

सी से अलग, जावा वर्ग में static कीवर्ड परिभाषा का मतलब केवल यह किसी अन्य वर्ग की तरह एक सामान्य वर्ग है, लेकिन यह कोड कोड व्यवस्थित करने के लिए किसी अन्य वर्ग के अंदर घोषित किया जाता है।
एक)

class SomeOtherClass { 
    static class Me { 
     // If you "upgrade" me to a top-level class.... 
    } 
} 

ख)

class Me { 
    // I won't behave any different.... 
} 

कक्षा परिभाषाओं स्मृति में लोड किए गए हैं जब वर्ग प्रयोग किया जाता है: दूसरे शब्दों में, वहाँ घोषणा * के निम्नलिखित 2 रास्ता के बीच कोई अंतर नहीं है व्यवहार पहली बार, और यह "स्थैतिक" और "गैर स्थैतिक" कक्षाओं दोनों के लिए सच है। मेमोरी का उपयोग कैसे किया जाएगा, इसमें कोई फर्क नहीं पड़ता है। पुराने जेवीएम में, वस्तुओं को ढेर में हमेशा संग्रहित किया जाता था। आधुनिक JVMs जब यह संभव और फायदेमंद होता है तो स्टैक पर ऑब्जेक्ट आवंटित करते हैं, लेकिन यह अनुकूलन कोडर के लिए पारदर्शी है (कोड के माध्यम से इस व्यवहार को प्रभावित करना संभव नहीं है), और static कीवर्ड का उपयोग इस पर कोई प्रभाव नहीं पड़ता व्यवहार।

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

Singleton स्वचालित रूप से एक "विरोधी-पैटर्न" है? मुझे ऐसा नहीं लगता। सिंगलटन का दुर्व्यवहार है, लेकिन सिंगलटन पैटर्न में कई अच्छे उपयोग हो सकते हैं। यह बहुत दुर्व्यवहार होता है। यदि आपके पास सिंगलटन पैटर्न का उपयोग करने का वैध कारण है, तो इसका उपयोग करने में कुछ भी गलत नहीं है।



* ध्यान दें: क्यों बिल्कुल static लिखते हैं, आप पूछ सकते हैं। यह पता चला है कि "गैर स्थैतिक" नेस्टेड कक्षाओं में कुछ हद तक जटिल स्मृति प्रबंधन निहितार्थ होता है, और इसका उपयोग आमतौर पर तब तक निराश होता है जब तक आपके पास कोई अच्छा कारण न हो (कृपया अधिक जानकारी के लिए अन्य प्रश्नों का संदर्भ लें)।

class SomeOtherClass { 
    Stuff stuff; 
    class Me { 
     void method(){ 
      // I can access the instance variables of the outer instance 
      // like this: 
      System.out.println(SomeOtherClass.this.stuff); 
      // Just avoid using a non-static nested class unless you 
      // understand what its use is! 
     } 
    } 
} 
3

सिंगलटन वर्ग अनिवार्य रूप से एक private निर्माता के साथ एक नियमित उच्च-स्तरीय वर्ग, अपने सिधाई गारंटी करने के लिए है। सिंगलटन क्लास अपने उदाहरण को पकड़ने का एक तरीका प्रदान करता है। सिंगलटन कक्षाएं परीक्षण करने में बहुत आसान नहीं हैं, इसलिए हम Just Create Once के विचार से चिपकते हैं।

static कक्षा अनिवार्य रूप से एक नेस्टेड कक्षा है। एक घोंसला वर्ग अनिवार्य रूप से एक बाहरी स्तर की कक्षा है जो केवल पैकेजिंग सुविधा के लिए किसी अन्य वर्ग में घिरा हुआ है। कम से कम जावा में static के रूप में घोषित नहीं किया जा सकता है - आपको इसे स्वयं आज़माएं।

इस स्थिर कक्षाओं के लिए असंतुष्ट लाभ होगा जब वर्ग सिंगलटन की तुलना में?

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

अतिरिक्त पठन:

0

एक और अन्य के बीच मतभेद, स्मृति प्रबंधन है कि आपके ऐप में, बहुत कुछ दृष्टांत करना होगा कि जला होगा एक स्मृति की तरह स्मृति एक स्मृति समस्या, प्रदर्शन और अन्य चीजें बनने ... यह मदद कर सकता है ...

http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

0

मैं इसे एक विरोधी पैटर्न है डर लग रहा है: http://thetechcandy.wordpress.com/2009/12/02/singletons-is-anti-pattern/

+0

यह वास्तव में एक महान लेख है, यह एकल और कब और इसका उपयोग करने के लिए दोनों समस्याओं के बारे में बात करता है यदि आप चुनते हैं। मुझे समझ में नहीं आता कि कोई भी इसे कम वोट क्यों देगा। –

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