2013-08-13 8 views
7

सिंगलटन डिजाइन पैटर्न को लागू करने के लिए एक मानक तरीका यह है:कार्यान्वयन सिंगलटन वैकल्पिक रूप से

public class Singleton { 
    private static Singleton instance = new Singleton(); 

    public static Singleton getInstance() { 
     return instance; 
    } 

    private Singleton() {} 
} 

अगर आप भी इस तरह इसे लागू कर सकता है मैं सोच रहा था:

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

और हाँ जो अगर संस्करण बेहतर है ?

+0

के संभावित डुप्लिकेट [क्या जावा में एक सिंगलटन पैटर्न लागू करने के लिए एक कारगर तरीका है?] (Http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement -ए-सिंगलटन-पैटर्न-इन-जावा) –

उत्तर

10

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

सही समाधान enum का उपयोग करना है जो एक एकल मान को परिभाषित करता है।

public enum Singleton { 
    INSTANCE; 

    // methods 
} 

प्रभावी जावा से:

हालांकि यह दृष्टिकोण अभी तक है व्यापक रूप से अपनाया जा रहा है, एक एकल तत्व enum प्रकार एक सिंगलटन लागू करने के लिए सबसे अच्छा तरीका है।

+0

@ denis.soloneko: धन्यवाद! – jason

+0

हू। यह बहुत मजेदार है। Enum मूल्य कब शुरू किया जाता है? क्या यह 'सिंगलटनहोल्डर' तकनीक हल करने वाली सभी समवर्ती समस्याओं को हल करता है? –

+1

@ जेसन सी: जब 'एनम' कक्षा शुरू की जाती है, तो 'स्थिर' प्रारंभकर्ता 'स्थिर' सदस्यों के लिए चलाए जाने पर बहुत अधिक होता है। हां, यह सभी समवर्ती समस्याओं को हल करता है क्योंकि यह मूल रूप से 'स्थिर 'प्रारंभकर्ताओं के समान होता है। – jason

0

मेरी राय में पहले एक बेहतर है क्योंकि यह ऑब्जेक्ट ओरिएंटेड दृष्टिकोण के साथ अधिक गठबंधन दिखता है।

+0

वही पहला है। – Henry

+0

@ हेनरी इसे पॉइंट करने के लिए धन्यवाद, मैं बस कोड को गलत तरीके से पढ़ता हूं। –

+0

हां यह encapsulation का उपयोग करता है। –

0

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

विश्वविद्यालय मैरीलैंड के कंप्यूटर विज्ञान शोधकर्ता बिल प्यूघ के बारे में लिखा है जावा में लागू होने पर सिंगलटन पैटर्न के अंतर्गत कोड मुद्दे। [11] "डबल-चेक किए गए लॉकिंग" मुहावरे पर पुग के प्रयासों ने जावा 5 में जावा मेमोरी मॉडल में बदलाव और जावा में सिंगलेट्स को लागू करने के लिए आम तौर पर मानक विधि के रूप में माना जाता है। मांग धारक मुहावरे पर प्रारंभिक तकनीक के रूप में जाना जाने वाला तकनीक, जितना संभव हो उतना आलसी है, और जावा के सभी ज्ञात संस्करणों में काम करता है। यह वर्ग प्रारंभिकरण के बारे में भाषा गारंटी का लाभ उठाता है, और इसलिए सभी जावा-अनुपालन कंपाइलरों और आभासी मशीनों में सही तरीके से काम करेगा। नेस्टेड() को उस क्षण की तुलना में पहले से संदर्भित किया गया है (और इसलिए क्लास लोडर द्वारा पहले लोड नहीं किया गया)। इस प्रकार, यह समाधान विशेष भाषा संरचनाओं (यानी अस्थिर या सिंक्रनाइज़) की आवश्यकता के बिना थ्रेड-सुरक्षित है।

public class Singleton { 
     // Private constructor prevents instantiation from other classes 
     private Singleton() { } 

     /** 
     * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
     * or the first access to SingletonHolder.INSTANCE, not before. 
     */ 
     private static class SingletonHolder { 
       public static final Singleton INSTANCE = new Singleton(); 
     } 

     public static Singleton getInstance() { 
       return SingletonHolder.INSTANCE; 
     } 
} 
+0

'निजी 'कन्स्ट्रक्टर एक विश्वसनीय उपभोक्ता द्वारा तत्कालता को रोकता नहीं है जो कन्स्ट्रक्टर को हैंडल प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकता है। – jason

+2

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

1

आप सिंगलटन को साकार करने के लिए enum का उपयोग क्यों नहीं करते?

public enum SingletonEnum { 
    Instance; 
    private static String testStr = ""; 

    public static void setTestStr(String newTestStr) { 
     testStr = newTestStr; 
    } 

    public static String getTestStr() { 
     return testStr; 
    } 

    public static String sayHello(String name) { 
     return "Hello " + name; 
    } 
} 
संबंधित मुद्दे