2009-09-30 17 views

उत्तर

6

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

public enum Singleton { 
    INSTANCE; 

    // fields and methods go here 
} 
+0

+1। मैंने लोल किया :) – corsiKa

0

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

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

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

+0

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

+0

हां, यह करता है। जब तक वे पहले इस्तेमाल नहीं किए जाते हैं तब तक जावा कक्षाओं को लोड नहीं करता है। –

+1

पूरी तरह से सच नहीं है। जब उन्हें पहले संदर्भित किया जाता है, तो यह उन्हें लोड करता है, उदा। किसी अन्य वर्ग के विधि हस्ताक्षर में। – skaffman

1

आलसी instanciation के बारे में क्या: getInstance() सिंगलटन देता है या अगर यह पहली कॉल है तो इसे बनाते हैं।

public class MySingleton 
{ 
    private static MySingleton instance; 

    private MySingleton() 
    { 
     // construct object . . . 
    } 

    // For lazy initialization 
    public static synchronized MySingleton getInstance() 
    { 
     if (instance==null) 
     { 
      instance = new MySingleton(); 
     } 
     return instance; 
    } 

    // Remainder of class definition . . . 
} 
+1

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

+0

यह भी ध्यान दें कि यह कार्यान्वयन उदाहरण के संदर्भ प्राप्त करने के हर प्रयास को सिंक्रनाइज़ करता है। चूंकि अधिकांश कोड कुछ ऐसा करेंगे: सिंगलटन.getInstance.do कुछ(); सिंगलटन.getInstance.do SomethingElse(); कुल प्रभाव सदस्य सिंक्रनाइज़ेशन को सदस्य पहुंच/उत्परिवर्तन के संदर्भ में कोई थ्रेड सुरक्षा गारंटी के साथ गंभीर रूप से सीमित समेकन होगा। –

+0

जावा में डबल-चेक लॉकिंग टूटा हुआ है http://www.javaworld.com/jw-02-2001/jw-0209-double.html संक्षेप में, यह गारंटी देने का यह तरीका है कि इस वर्ग को तुरंत एक बार परिणाम दिया जा सकता है कठिन खोजने के लिए समेकन मुद्दों। इसका कभी भी उपयोग न करें। – Buhb

11

सिंगलटन बनाने का सबसे अच्छा तरीका? एक enum का प्रयोग करें।

public enum Singleton { 
    INSTANCE; 
    public void foo(){ ... } 
} 

// Usage: 
Singleton.INSTANCE.foo(); 

आप न केवल डबल इन्स्टेन्शियशन से बचने के लिए वीएम से मदद की बहुत सारी मिलता है, लेकिन यह भी मदद करता है आप अक्रमांकन भ्रष्टाचार से बचें।

0

यदि आप सहमति के बारे में परवाह करते हैं, तो आप साझा वैश्विक स्थिति का उपयोग नहीं करेंगे।

+2

यदि सिंगलटन एकवचन समांतर समस्या से परिणामों का संचय रखता है तो क्यों नहीं? एक सिंगलटन वैश्विक राज्य का प्रतीक है, और इस तरह यह एक उचित उपयोग परिदृश्य होगा। –

+1

कक्षाओं के लिए कई उपयोग मामले हैं जो केवल एक उदाहरण के साथ प्रदर्शित होते हैं जो प्रक्रियाओं के बीच साझा किया जाता है।बसंत का उपयोग करके एक ठेठ अच्छी तरह से डिज़ाइन किए गए वेबपैप में शायद सिंगलटन स्कोप में तत्काल कक्षाओं का एक गुच्छा होगा, जो कार्यकर्ता धागे के बीच साझा किया जाएगा। एक्सेस संशोधक पर स्कोफिंग के लिए – Buhb

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