2009-10-22 25 views
5

मुझे खेद है कि यह एक डुप्लिकेट या बहुत प्राथमिक है, लेकिन मैं एक सिंगलटन क्लास कैसे बना सकता हूं जिसे उपclassed किया जा सकता है?मैं अन्य कक्षाओं को सिंगलटन कक्षा से कैसे प्राप्त करूं?

+1

डाउनवोट क्यों? यह एक वैध सवाल की तरह लगता है? –

+1

शायद डाउनवॉटर ने हाल ही में रात्रिभोज किया था और वर्तमान में यह महसूस कर रहा है, इसलिए "वैकल्पिक" संदर्भ अपरिहार्य महसूस कर रहा है ...? –

+0

क्षमा करें @ एलेक्स। मैंने आपके मजाक को सही तरीके से बर्बाद कर दिया क्योंकि आपने इसे पोस्ट किया था। –

उत्तर

11

स्टीव येग है एक मनोरंजक article एकमात्र है कि इस बोली में उपवर्गीकरण उल्लेख के बारे में:

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

+0

तो उत्तर "नहीं" है? – unj2

+1

अगर आप इसे इस तरह पढ़ना चाहते हैं, तो हाँ, यह नहीं है। या आप इसे पढ़ सकते हैं और देख सकते हैं कि उत्तर हाँ है, लेकिन आपको अभी भी यह कोशिश नहीं करनी चाहिए, और आप मूल्यांकन करना चाहेंगे कि आप पहली जगह में सिंगलटन का उपयोग क्यों कर रहे हैं। –

5

आप आमतौर पर किसी भी उपयोगी अर्थ में नहीं कर सकते हैं। सिंगलटन कक्षाओं का उपयोग न करने का यह एक और कारण होगा।

1

आप अपने सिंगलटन निर्धारित किया है तो के रूप में:

public class Singleton { 
    private static Singleton instance; 
    public static Singleton getInstance() { 
    if (instance == null) { 
     instance = new Singleton(); 
    } 
    return instance; 
    } 
    private Singleton() { 
    } 
} 

तो फिर तुम सिर्फ कर सकते हैं:

public class NewSingleton extends Singleton { 
} 

लेकिन, आप निजी तरीकों का उपयोग करने के लिए, इसलिए यदि आप करना चाहते हैं नहीं कर सकेंगे सिंगलटन का उपयोग करें, आपको अभी भी Singleton.getInstance(); पर कॉल करने की आवश्यकता होगी ताकि आप इसे विस्तारित करके कुछ हासिल न करें।

लेकिन, ऐसा कोई कारण नहीं है कि आप इसे क्यों नहीं कर सकते हैं।

अब, यदि आप सिंगलटन कक्षा में अधिक फ़ंक्शंस जोड़ना चाहते हैं तो आप एस्पेक्टजे से इंटर-टाइप पहलुओं का उपयोग कर सकते हैं और सिंगलटन में नए तरीकों/गुणों को इंजेक्ट कर सकते हैं जिसका उपयोग सिंगलटन द्वारा किया जा सकता है।

1

सिंगलटन उदाहरण विरासत को सीमित नहीं करता है। खैर - जैसा कि पहले से ही बताया गया है कि यह विरासत की उपयोगिता को सीमित करता है और फिर आप निजी कन्स्ट्रक्टर को पैक या संरक्षित करने के लिए आराम कर सकते हैं (जिसे आप तर्क दे सकते हैं कि सिंगलटन की सिंगलोनिस कम हो जाती है) लेकिन उद्देश्य क्या है?

3

असल में, मुझे नहीं लगता कि यह संभव है।

आप अपने कन्स्ट्रक्टर को private घोषित करके कक्षा एकल एकल बनाते हैं। लेकिन यदि आप अपने सिंगलटन वर्ग के उप-वर्ग घोषित करने का प्रयास करते हैं, तो सबक्लास निर्माता कन्स्ट्रक्टर सुपरक्लास के रचनाकारों को देखने में सक्षम नहीं होंगे ... इसलिए वे संकलित नहीं होंगे; जैसे

public class A() { 
    private A() { } 
} 

public class B() { 
    private B() { } 
} 

दोनों सूर्य JDK 1.6 और ग्रहण गेनीमेड संकलक प्रभाव है कि एक के लिए कोई आर्ग निर्माता दिखाई नहीं देता है करने के लिए, निर्माता बी में एक संकलन त्रुटि दे।

आप private रचनाकारों की दृश्यता बढ़ा सकते हैं, लेकिन फिर कुछ भी नहीं है (अच्छी समझ के अलावा) किसी को इसके कई उदाहरण बनाने से रोकना। दूसरे शब्दों में यह वास्तव में एक सिंगलटन वर्ग नहीं है।

संपादित करें: मुझे लगता है कि एक कोशेर विकल्प एक या अधिक अमूर्त (गैर-सिंगलटन) कक्षाओं के पेड़ को परिभाषित करना होगा, जिन तरीकों से आप आम होना चाहते हैं, और फिर पत्ती वर्गों के रूप में एकाधिक सिंगलटन कक्षाएं परिभाषित करें के रूप में उपयुक्त। लेकिन यह एक सिंगलटन वर्ग नहीं है जो दूसरे को उप-वर्गीकृत करता है।

+0

यह संकलित करता है ... मैं 2 टेस्ट कक्षाएं बनाने पर अपना समय कम करने के लिए पर्याप्त मूर्ख हूं। तो यह करता है (कम से कम - कोई तर्क निर्माता नहीं) – Bostone

+0

ओह बैल - 'अपशिष्ट' – Bostone

+0

जानवरों को इसके साथ क्या करना है ??? :-) –

0

जैसा कि अन्य ने पहले ही जवाब दिया है, सिंगलटन सबक्लासिंग के उपयोग छोटे हैं। यदि आपको सिंगलटन के संदर्भ में एक रणनीति पैटर्न की आवश्यकता है, तो आप एकल इंटरफ़ेस को परिभाषित कर सकते हैं और सिंगलटन इंस्टेंस में उस इंटरफ़ेस के कार्यान्वयन के लिए प्रतिनिधि हो सकते हैं। यह समस्या को एक परत नीचे ले जाता है और इसे और स्पष्ट करता है कि आप इसे क्यों करना चाहते हैं।

अपने प्रश्न का उत्तर देने के लिए; , अपरीक्षित कोड अपवाद हैंडलिंग, आदि जोड़ने :-) Btw, सुनिश्चित करें:

public static synchronised Singleton getInstance() { 
    if (instance == null) { 
     String clsName = System.getProperties().getProperty("singleton.class"); 
     if (className == null || 0 == clasName.length()) { 
      instance = new Singleton(); 
     } else { 
      Class cls = Class.forName(clsName); 
      instance = (Singleton) cls.newInstance(); 
     } 
    } 
    return instance; 
} 

अस्वीकरण: विशेष उपवर्ग आपके आवेदन का उपयोग करता है, उदाहरण के लिए प्रणाली के गुणों में परिभाषित किया गया है के लिए पसंद संभालने, आप की तरह कुछ कर सकते हैं आपकी getInstance() विधि सिंक्रनाइज़ है।

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

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