मेरे पास सिंगलटन कक्षाओं का एक सेट है और मैं बॉयलरप्लेट कोड से बचना चाहता हूं। यहाँ मैं अब है:विरासत के साथ जावा सिंगलटन
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
}
}
मैं यह कैसे कर सकता हूं?
आपका सिंगलटन getInstance() विधि ठीक से लागू नहीं कर रहा है -। एक मल्टी-थ्रेडेड वातावरण में आप कर सकते हैं कई उदाहरण बनाए जा रहे हैं! – Liv
आपके प्रश्न का उत्तर नहीं है, लेकिन आपका सिंगलटन पैटर्न थ्रेड-सुरक्षित नहीं है। [जावा कंसुरेंसी इन प्रैक्टिस] में कुछ उदाहरण हैं (http://www.amazon.com/Java-Concurrency- अभ्यास- ब्रायन-Goetz/dp/0321349601)। – Bruno
क्या सिंगलटन वास्तव में यहां सबसे अच्छा तरीका है? सिंगलटन का सबसे अच्छा उपयोग सेवाओं या अन्य चीजों का प्रतिनिधित्व करने के लिए किया जाता है जो असली दुनिया में वास्तव में केवल एक उदाहरण है। सुनिश्चित करें कि यह पैटर्न वास्तव में आपके एप्लिकेशन डोमेन के लिए उपयुक्त है क्योंकि मुझे लगता है कि आपका कोड वास्तव में बिल्लियों और कुत्तों का उपयोग नहीं कर रहा है। यदि सिंगलेट्स उचित हैं, तो मैं जिम गैरीसन के वसंत का उपयोग करने के समाधान का उपयोग करने की सलाह देता हूं; वसंत सेम डिफ़ॉल्ट रूप से सिंगलटन हैं। –