2013-08-09 3 views
21

से कॉलिंग विधि किसी भी मामूली वाक्यविन्यास त्रुटियों या व्हाट्नॉट क्षमा करें, मैं इसे एक जिट्सी मॉड्यूल के साथ अनुभव कर रहा हूं और जावा से सुपर परिचित नहीं होना चाहता हूं कि यह क्या हो रहा है और क्यों और कैसे तय किया जाना चाहिए। वर्ग बी मेंकन्स्ट्रक्टर

  • कॉल अधिरोहित लोड()
  • आरंभीकृत चर (कॉल ":

    public abstract class A 
    { 
        public A() 
        { 
        this.load(); 
        } 
    
        protected void load() 
        { 
    
        } 
    } 
    
    public class B extends A 
    { 
        private String testString = null; 
    
        public B() 
        { 
        super(); 
        } 
    
        @Override 
        protected void load() 
        { 
        testString = "test"; 
        } 
    } 
    

    आवेदन इस जब वर्ग बी का उदाहरण बनाकर नाम विधि द्वारा एक लोड वर्ग का उपयोग कर रही है निजी स्ट्रिंग testString = शून्य "डीबगर के अनुसार), उन्हें बाहर निकालना।

क्या यह जावा व्यवहार अपेक्षित है? इसका कारण क्या हो सकता है? यह एक जावा 1.6 एप्लिकेशन है जो 1.7 जेडीके पर चल रहा है।

उत्तर

55

क्या यह जावा व्यवहार अपेक्षित है?

हां।

इसका कारण क्या हो सकता है?

गैर-अंतिम सुपर क्लास कन्स्ट्रक्टर में गैर-अंतिम ओवरराइड विधि का आपका आविष्कार।

  • आप B का एक उदाहरण बनाने के लिए:

    देखते हैं क्या कदम-दर-कदम होता है।

  • B() सुपर क्लास कन्स्ट्रक्टर - A() पर कॉल करता है, सुपर क्लास सदस्यों को प्रारंभ करने के लिए।
  • A() अब प्रारंभिक भाग के रूप में B कक्षा में ओवरराइड की गई एक गैर-अंतिम विधि का आह्वान करता है।
  • क्योंकि संदर्भ में उदाहरण B वर्ग है, विधि load() लागू की गई B कक्षा है।
  • load()B क्लास इंस्टेंस फ़ील्ड - testString आरंभ करता है।
  • सुपर वर्ग निर्माता काम खत्म, और रिटर्न (निर्माता की श्रंखला मान लिया जाये कि जब तक Object वर्ग समाप्त कर दिया गया है)
  • B() निर्माता आगे को क्रियान्वित करने शुरू होता है, आरंभ में यह खुद सदस्य है।
  • अब, initilization प्रक्रिया के एक हिस्से के रूप में, B पिछले लिखित मान को testString में ओवरराइट करता है, और इसे null पर पुन: प्रारंभ करता है। कभी यह निर्माता में एक गैर अंतिम वर्ग के एक गैर अंतिम सार्वजनिक विधि कॉल:

नैतिक

+21

नैतिक – yshavit

+1

महान उत्तर के लिए +1। बस बहुत सी सीखा। धन्यवाद। –

+0

बहुत बढ़िया, धन्यवाद। मैं जांच करूंगा कि परियोजना के अन्य हिस्सों कैसे काम करते हैं, वे इसे सही तरीके से कर रहे हैं और यह बाहरी है, इसलिए मैं शेष एप्लिकेशन के व्यवहार का पालन करूंगा। – StrangeWill

5

यह प्रारंभिक-निर्माण के साथ एक आम समस्या-पैटर्न है, और अक्सर इंफ्रास्ट्रक्चर कोड & घर से बना डीएओ में पाया जा सकता है।

'शून्य' के लिए असाइनमेंट अनइडेड & हटाया जा सकता है।

यदि यह एक त्वरित पैच के रूप में पर्याप्त नहीं है, तो: सभी पोस्ट-निर्माण इनिट को एक अलग विधि में ले जाएं, और इसे सभी को "स्थैतिक विधि" छद्म-कन्स्ट्रक्टर में लपेटें।

और यदि आप डीएओ सामान कर रहे हैं, तो "लोड" और "निर्माण" के बीच अंतर करना वास्तव में अच्छा है, क्योंकि ये पूरी तरह से अलग तत्काल हैं। अलग-अलग "स्थैतिक कन्स्ट्रक्टर" विधियों को परिभाषित करें & शायद इनके लिए अलग आंतरिक आंतरिक।

abstract public class A { 
    protected void initAfterCreate() {} 
} 

public class B { 

    @Override 
    protected void initAfterCreate() { 
     this.testString = "test"; 
    } 

    // static constructors; 
    //  --   
    static public B createB() { 
     B result = new B(); 
     result.initAfterCreate(); 
    } 
} 

दिखाते लोड/एक डीएओ के लिए जुदाई बनाएँ:

public class Order { 
    protected int id; 
    protected boolean dbExists; 

    static public load (int id) { 
     Order result = new Order(id, true); 
     // populate from SQL query.. 
     return result; 
    } 
    static public create() { 
     // allocate a key. 
     int id = KeyAlloc.allocate("Order"); 
     Order result = new Order(id, false); 
    } 

    // internal constructor; not for external access. 
    // 
    protected Order (int id, boolean dbExists) { 
     this.id = id; 
     this.dbExists = dbExists; 
    } 
} 
+0

लोड() आमतौर पर मॉड्यूल द्वारा .properties फ़ाइलों से अपनी कॉन्फ़िगरेशन खींचने के लिए उपयोग की जाने वाली विधि है, मैंने जित्सी देव मेलिंग सूची के साथ आधार छुआ है और हम देखेंगे कि उनके कोड में स्थिरता बनाए रखने के लिए उनके अनुशंसित दृष्टिकोण क्या हैं (सभी मॉड्यूल गुण लोड नहीं करते हैं, और मैं देखकर थक गया हूं ... वैसे भी अपनी सूची में एक बग फाइल करना है)। – StrangeWill

+0

ठीक है, तो यह डीएओ सामान नहीं है। इससे यह आसान हो जाएगा - तब केवल एक प्रारंभिक पथ होना चाहिए। 'initAfterCreate()' एकमात्र मौलिक रूप से विश्वसनीय समाधान है, और अधिमानतः एक स्थिर फैक्ट्री विधि में लपेटें। –

+0

क्यों एक डाउनवोट? इनिट-ऑन-निर्माण टंगलों के बहुत सारे वास्तविक अनुभव साझा करना - व्यावहारिक परिस्थितियों में वे उत्पन्न होते हैं, और प्रभावी पैटर्न ('स्थिर कन्स्ट्रक्टर') उन्हें हल करने के लिए। –

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