2010-12-14 9 views
18

मैं कुछ विरासत कोड को फिर से फैक्टर कर रहा हूं, लेकिन डिज़ाइन निर्णय से फंस गया था और Google को उचित शर्तों को समझ नहीं पाया। मेरा पूर्ववर्ती इस तरह के ब्लॉक का उपयोग करेगा:जावा में, कोई कीवर्ड वाला कोई कोड ब्लॉक क्यों नहीं है, केवल घुंघराले ब्रैकेट

public class ChildClass extends ParentClass { 
    { 
     inheritedVar = "someVal"; 
    } 

    public ChildClass(){ /* constructor exists */ } 
    // rest of code 
} 

कोई कीवर्ड वाले कोड के ब्लॉक को घोषित करने का क्या मतलब है? यह एक स्थिर ब्लॉक की तरह व्यवहार नहीं करता है, मुझे विश्वास नहीं है। क्या यह निर्माता में स्थापित करने का विकल्प है? अगर कारखाने का इस्तेमाल किया जा रहा है तो इसका कुछ प्रभाव होगा (इस मामले में यह नहीं है)? मुझे this happening in C पर एक संबंधित धागा मिला लेकिन तर्क (स्कोप & परिवर्तनीय घोषणा) जावा के लिए प्रासंगिक प्रतीत नहीं हुआ।

इस "क्यों" पर किसी भी विचार या विचार की सराहना की जाएगी। यह फिर से कारक करने के लिए काफी आसान है, मैं इस बिंदु पर सिर्फ उत्सुक हूँ।

उत्तर

29

यह एक प्रारंभकर्ता ब्लॉक है। (स्थिर प्रारंभकर्ता ब्लॉक करने के लिए संबंधित) इस पृष्ठ पर प्रारंभ करने उदाहरण सदस्य देखें:

http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

यह एक निर्माता के लिए एक विकल्प है। कोड साझा करने के तरीके के रूप में एकाधिक, अधिभारित कन्स्ट्रक्टर प्रदान करते समय आप इसका उपयोग कर सकते हैं।

व्यक्तिगत रूप से, हालांकि, मुझे लगता है कि कन्स्ट्रक्टर अज्ञात कोड ब्लॉक पर भरोसा करने के बजाय नामित प्रारंभिक विधि को कॉल करने के लिए बहुत स्पष्ट है। हालांकि, कंपाइलर दृश्यों के पीछे सभी रचनाकारों को प्रारंभकर्ता ब्लॉक की प्रतिलिपि बनाता है और आप तर्क दे सकते हैं कि एक विधि घोषणा को इनलाइन करने के समान प्रदर्शन वृद्धि है।

+1

+1। – birryree

+1

+1: मैं नामांकित प्रारंभिक तरीकों से सहमत हूं। हालांकि, यह देखते हुए कि केवल एक कन्स्ट्रक्टर है, मेरे कोड बेस में इस ब्लॉक का पूरा बिंदु बल्कि व्यर्थ लगता है। – Riggy

+0

@ रग्गी, यह निश्चित रूप से अनावश्यक है। – Mike

-3

गुंजाइश। ब्लॉक में घोषित कोई भी चर ब्लॉक के बाद गुंजाइश से बाहर हो जाता है। कम से कम चरम रखने के लिए यह उपयोगी है।

इसके अलावा, यदि आप किसी अज्ञात आंतरिक कक्षा को परिभाषित करते हैं, तो आप कन्स्ट्रक्टर के लिए इस वाक्यविन्यास का उपयोग करते हैं।

+0

काफी नहीं। यह गुंजाइश होगा, यह एक विधि शरीर के भीतर किया गया था। यह विधियों के बाहर, कक्षा के शरीर में है। अन्य उत्तरों पढ़ें। –

+0

-1 यह एक गलत जवाब है।मामले में यह एक प्रारंभिक ब्लॉक है। इस ब्लॉक के सही उपयोग को इंगित करने के लिए –

16

इसे initializer block कहा जाता है। हर निर्माता में

{ 
     // whatever code is needed for initialization goes here 
    } 

जावा कम्पाइलर प्रतियां प्रारंभकर्ता ब्लॉक:

उदाहरण चर के लिए

प्रारंभकर्ता ब्लॉक देखने के सिर्फ स्थिर प्रारंभकर्ता ब्लॉक की तरह है, लेकिन बिना static मुख्य शब्द। इसलिए, इस दृष्टिकोण का उपयोग कई रचनाकारों के बीच कोड के ब्लॉक को साझा करने के लिए किया जा सकता है।

+0

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

+0

एक छोटा नाइटपिक - कंपाइलर प्रारंभकर्ता ब्लॉक की प्रतिलिपि नहीं करता है, यह केवल कन्स्ट्रक्टर से विशेष विधि में एक कॉल जोड़ता है, जो कि {} .class फ़ाइल में होता है। [स्टेटिक प्रारंभकर्ता ब्लॉक विधि बन जाता है।] –

4

आपका पूर्ववर्ती अभी भी सीख रहा था।

यह सबसे अच्छा स्पष्टीकरण है जो आपको मिलने की संभावना है। शायद एक समय में कोड इस तरह विभाजित होने की आवश्यकता थी। य़ह कहना कठिन है। कोड निश्चित रूप से इस तरह के बजाय लिखा जाना चाहिए:

 
public class ChildClass extends ParentClass { 
    public ChildClass() { 
     inheritedVar = "someVal"; 
    } 
    // rest of code 
} 

प्रारंभकर्ता ब्लॉक के लिए के रूप में, अपने उद्देश्य अन्य उत्तर यहाँ द्वारा दिया गया है। मैंने आपके जवाब को "क्यों" जवाब देने के प्रयास के रूप में फेंक दिया, जिसे आपने अनुरोध किया था। दुर्भाग्यवश, वास्तविक उत्तर के लिए, आपको अपने पूर्ववर्ती से पूछना होगा।

+0

मैंने एसओ पाठकों को कचरा कोड के साथ बोझ किए बिना अपना बिंदु प्राप्त करने के लिए केवल न्यूनतम मात्रा में कोड पोस्ट किया था। मैंने केवल कन्स्ट्रक्टर को शामिल किया ताकि यह स्पष्ट हो सके कि कोड में एक कन्स्ट्रक्टर मौजूद है और नामहीन ब्लॉक कन्स्ट्रक्टर को प्रतिस्थापित नहीं कर रहा था। धन्यवाद! – Riggy

+0

कोई समस्या नहीं है। मैंने इसके बारे में पूछने के मेरे जवाब का हिस्सा हटा दिया। –

+4

आप सही हैं कि यह सबसे अच्छा कोड नहीं है। मैं सुझाव दूंगा कि पूर्ववर्ती सीख रहा था। ऐसे कई देव हैं जो अन्य देवताओं को बुलाते हैं, और जो कुछ भी करता है वह लोगों को अपनी गलतियों को छुपाता है ताकि वे शर्मिंदा या बदतर न हों। मैं देखना चाहता हूं कि "आपका पूर्ववर्ती अभी भी सीख रहा था कि कैसे अच्छी तरह से कोड करना है"। मैं देवताओं के लिए चीजों को करने के सही तरीके सीखने के लिए सुरक्षित वातावरण बनाने के लिए एक मिशन पर हूं, और दृढ़ता से महसूस करता हूं कि स्टैक ओवरफ्लो उनमें से एक होना चाहिए - क्या आप मदद करने के लिए तैयार रहेंगे, और आपके द्वारा उपयोग की जाने वाली भाषा को बदल देंगे? – Lunivore

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