2011-06-10 16 views
8

मेरे पास सिंगलटन कक्षाओं का एक सेट है और मैं बॉयलरप्लेट कोड से बचना चाहता हूं। यहाँ मैं अब है:विरासत के साथ जावा सिंगलटन

public class Mammal { 
    protected Mammal() {} 
} 

public class Cat extends Mammal { 
    static protected Cat instance = null; 
    static public Cat getInstance() { 
     if (null == instance) { 
      instance = new Cat(); 
     } 
     return instance; 
    } 

    private Cat() { 
     // something cat-specific 
    } 
} 

यह काम करता है और इसमें कुछ भी गलत नहीं है, सिवाय इसके कि मैं Mammal के कई उपवर्गों कि getInstance() विधि को दोहराने चाहिए है। यदि संभव हो तो मैं इस तरह कुछ पसंद करूंगा:

public class Mammal { 
    protected Mammal() {} 

    static protected Mammal instance = null; 

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

public class Cat extends Mammal { 
    private Cat() { 
     // something cat-specific 
    } 
} 

मैं यह कैसे कर सकता हूं?

+1

आपका सिंगलटन getInstance() विधि ठीक से लागू नहीं कर रहा है -। एक मल्टी-थ्रेडेड वातावरण में आप कर सकते हैं कई उदाहरण बनाए जा रहे हैं! – Liv

+1

आपके प्रश्न का उत्तर नहीं है, लेकिन आपका सिंगलटन पैटर्न थ्रेड-सुरक्षित नहीं है। [जावा कंसुरेंसी इन प्रैक्टिस] में कुछ उदाहरण हैं (http://www.amazon.com/Java-Concurrency- अभ्यास- ब्रायन-Goetz/dp/0321349601)। – Bruno

+0

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

उत्तर

3

आप तब से नहीं कर सकते जब कन्स्ट्रक्टर न तो विरासत में हैं और न ही अतिसंवेदनशील हैं। आपके वांछित उदाहरण में new Mammal() केवल Mammal बनाता है, जो इसके उप-वर्गों में से एक नहीं है। मेरा सुझाव है कि आप कारखाने के पैटर्न को देखें, या वसंत की तरह कुछ पर जाएं, जिसका उद्देश्य केवल इस स्थिति के लिए है।

2

आप सिंगलेट बनाने के लिए enum का उपयोग कर सकते हैं।

public enum Mammal { 
    Cat { 
     // put custom fields and methods here 
    } 
} 
0

अपने कन्स्ट्रक्टर को निजी बनाएं, इससे आपकी कक्षा अन्य वर्गों द्वारा विरासत में आ जाएगी।

या सबसे अच्छा तरीका एक सिंगलटन बनाने के लिए एक गणना के साथ अपने वर्ग एक enum बनाने के द्वारा है (जोश ब्लॉक)

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