2010-09-15 21 views
23

संभावित डुप्लिकेट:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?सिंगलटन वर्ग और स्थैतिक वर्ग के बीच अंतर?

HI मैं स्पष्ट रूप से हो रही है नहीं कर रहा हूँ एक सिंगलटन वर्ग और एक स्थिर वर्ग के बीच क्या अंतर है? क्या कोई इसे उदाहरण के साथ विस्तृत कर सकता है?

+5

http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern – oksayt

+1

डुप्लीकेट की तरह लगता है अगर आपको वह जानकारी मिलती है जो आपको प्राप्त जानकारी के रूप में स्वीकार करने के लिए भूल जाते हैं .. –

+0

जांचें http://stackoverflow.com/a/37114702/1406510 – nanosoft

उत्तर

4

यह पैटर्न और पैटर्न को कैसे कार्यान्वित किया जाता है, के बीच अंतर है।

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

इसके अलावा, सिंगलटन को लागू करने के कुछ तरीके दूसरों की तुलना में बेहतर हैं।

public class Example { 
    private static final Example SINGLETON = new Example(); 

    public Example getInstance() { return SINGLETON; } 

    private Example() { /* Constructor */ } 
} 

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

+2

यदि आपकी 'getInstance() 'विधि' स्थिर' नहीं है, तो संभावित उपयोगकर्ता को इस कक्षा का उदाहरण कैसे प्राप्त करना चाहिए यदि उन्हें आवश्यकता हो एक प्राप्त करने के लिए एक उदाहरण है? – winklerrr

1

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

स्थैतिक वर्ग हमेशा एक सदस्य वर्ग है, जो एक आंतरिक वर्ग के विपरीत, आसपास के वर्ग के आवृत्ति चर तक पहुंच नहीं है।


स्टेटिक वर्ग उदाहरण

public class A { 
    public static class B {   
    }  
    public  int notAccessibleForB; 
    public static int accessibleForB; 
} 

सिंगलटन पैटर्न (सरल पुरानी शैली)

public final class Singleton { 
    public final static Singleton INSTANCE = new Singleton(); 
    private Singleton(){} 
} 

सिंगलटन पैटर्न (सरल आधुनिक शैली)

public enum Singleton { 
    INSTANCE; 
} 
16

पुराने कुए/ans इतने पर: Difference between static class and singleton pattern?

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

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

16

सिंगलटन क्लास: सिंगलटन क्लास वह वर्ग है जिसमें प्रति वर्ग लोडर केवल एक ही उदाहरण मौजूद हो सकता है।

स्टेटिक/हेल्पर क्लास (केवल स्थिर फ़ील्ड/विधियों वाला वर्ग): इस वर्ग का कोई उदाहरण मौजूद नहीं है। केवल फ़ील्ड और विधियों को सीधे स्थिरांक या सहायक तरीकों के रूप में उपयोग किया जा सकता है।

इस blog "Static classes in Java" से संदर्भित किया गया है इसे अच्छी तरह से वर्णन करता है। ब्लॉग भी एक ही स्पष्टीकरण के लिए उदाहरण है:

सिंगलटन उदाहरण:

public class ClassicSingleton { 
    private static ClassicSingleton instance = null; 

    private ClassicSingleton() { 
     // Exists only to defeat instantiation. 
    } 

    public static ClassicSingleton getInstance() { 
     if (instance == null) { 
      instance = new ClassicSingleton(); 
     } 
     return instance; 
    } 
} 

स्टेटिक कक्षा उदाहरण:

/** 
* A helper class with useful static utility functions. 
*/ 
public final class ActionHelper { 

    /** 
    * private constructor to stop people instantiating it. 
    */ 
    private ActionHelper() { 
     // this is never run 
    } 

    /** 
    * prints hello world and then the users name 
    * 
    * @param users 
    *   name 
    */ 
    public static void printHelloWorld(final String name) { 
     System.out.println("Hello World its " + name); 
    } 

} 

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

एक ही जवाब भी मेरा उत्तर here

+0

जावा प्रतिबिंब का उपयोग अभी भी "स्थैतिक वर्ग" के लिए किसी भी उदाहरण के आविष्कार को तोड़ने के लिए नहीं किया जा सकता है। एक [enum समाधान] (http://shamsmi.blogspot.com/2013/05/emptytons-mimicking-static-classes-in.html) अभी भी invariant को संरक्षित करेगा। – shams

+0

और तत्कालता को हराने के लिए क्यों? क्या होगा यदि आपको तर्क का पालन करने के लिए कन्स्ट्रक्टर तर्कों की आवश्यकता है और फिर भी बाकी स्थिर रखें। –

+0

सिंगलटन उदाहरण में getInstance थ्रेड सुरक्षित नहीं है, सिंक्रनाइज़ करने की आवश्यकता है। – kecso

5

अंतर नहीं सिंगलटन ask.because करने का सही तरीका है एक कीवर्ड की तुलना में स्थिर नहीं है से संदर्भित है। आपको पूछना चाहिए "किसको चुनना है?"। स्थिर वर्ग पर सिंगलटन वर्ग के फायदे क्या हैं, ये प्रश्न डिजाइन चरणों में आते हैं।

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

कब जाना है: 1. अपने कोड को विकसित करते समय, आप आगे की संगतता के बारे में सोचते हैं, जैसे कि आपको इस सिंगलटन कक्षा को सामान्य कक्षा में बदलने या उप-वर्गीकरण की अनुमति देने की आवश्यकता है। 2. जब आप सिंगलटन वर्ग भारी होते हैं तो आप आलसी लोडिंग सुविधा प्रदान कर सकते हैं।

स्थिर: उपयोग: कक्षाएं जो मूल रूप से रूपांतरण, उपयोगिता कार्य करती हैं। कृपया गणित वर्ग की जांच करें।

कब जाना है: 1. सहायक एपीआई विकास में सभी कक्षाओं द्वारा उपयोग की जाने वाली सहायक कक्षाएं।

नुकसान: 1. कक्षाएं उत्सुकता से लोड की जाती हैं।

अन्य लोगों से अंक की उम्मीद।

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