2010-10-17 18 views
39

मान लीजिए हम निम्नलिखित कोड है:निजी निर्माता के साथ वर्ग की फैली

class Test { 
    private Test() { 
     System.out.println("test"); 
    } 

} 

public class One extends Test { 

    One() { 
     System.out.println("One"); 
    } 

    public static void main(String args[]) { 

     new One(); 
    } 
} 

जब हम एक वस्तु One बनाते हैं, जो मूल रूप से माता पिता वर्ग निर्माता Test() बुलाया गया था। लेकिन Test() निजी था - हमें एक त्रुटि मिलती है। एक अच्छा उदाहरण और इस स्थिति से बाहर निकलने का तरीका कितना है?

उत्तर

39

कोई रास्ता नहीं है। आपको test का विस्तार करने में सक्षम होने के लिए एक सुपर (protected, public या डिफ़ॉल्ट) सुपर कन्स्ट्रक्टर बनाना होगा।

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

जब आप केवल private कंस्ट्रक्टर्स के साथ एक class है, तो आप भी classfinal क्योंकि यह बिल्कुल नहीं बढ़ाई जा सकती बदल सकते हैं।


एक अन्य समाधान test जो test के उदाहरण बना सकते हैं और एक test उदाहरण के लिए One से हर विधि कॉल को सौंपने में एक विधि होने दी जाएगी। इस तरह आपको test का विस्तार करने की आवश्यकता नहीं है।

class Test { 
    private Test() { 
     System.out.println("test"); 
    } 
    public static Test getInstance(){ 
     return new Test(); 
    } 
    public void methodA(){ 
     //Some kind of implementation 
    } 
} 

public class One { 
    private final Test test; 
    One() { 
     System.out.println("One"); 
     test = Test.getInstance(); 
    } 

    public void methodA(){ 
     test.methodA(); 
    } 

    public static void main(String args[]) { 
     new One(); 
    } 
} 
+4

कक्षा 'टेस्ट' की विधि' getInstance() 'विधि स्थिर होना चाहिए। अन्यथा 'test.getInstance()' जैसे कॉल करना संभव नहीं है। – vanje

+0

@vanje, धन्यवाद, –

1

test गैर private के निर्माता बनाने या test में One चलते हैं।

Btw, अपने नमूना कोड कुछ मुद्दों में शामिल हैं:

  • कक्षाएं शीर्षक केस (test की Test बजाय)
  • मैं One के निर्माता private बनाने के लिए जब तक यह है सुझाव देंगे नाम दिया जाना चाहिए एक ही पैकेज में एक अलग वर्ग से कहा जाता है
+0

अपडेट किया गया है यदि आपके पास परीक्षण का स्रोत कोड नहीं है? – powder366

0

दरअसल, मैंने पाया कि एक रास्ता है। इस तरह:

class Base { 
private Base() { 

} 

public void fn() { 
    System.out.println("Base"); 
} 

public static class Child extends Base { 
    public void fn() { 
     System.out.println("Child"); 
    } 
} 

public static Base getChild() { 
    return new Child(); 
}} 

अब, आप विस्तारित वर्ग के उदाहरण प्राप्त करने के लिए getChild() का उपयोग कर सकते हैं।

+5

यह केवल स्थिर आंतरिक वर्ग रखने पर ही काम करता है क्योंकि निजी विधियां आंतरिक कक्षाओं तक पहुंच योग्य होती हैं। दुर्भाग्यवश, इससे मदद नहीं मिलती है, क्योंकि यदि आप कक्षा को बदलने में सक्षम हैं तो आप संरक्षक को पहले स्थान पर संरक्षित या सार्वजनिक रूप से स्थापित करके बेहतर सेवा प्रदान कर रहे हैं .. –

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