2008-10-27 10 views
66

मैं कुछ जावा कोड के दो तरीकेजावा में घुंघराले ब्रेसिज़ का मतलब क्या है?

// Curly braces attached to an 'if' statement: 
if(node.getId() != null) 
{ 
    node.getId().apply(this); 
} 

// Curly braces by themselves: 
{ 
    List<PExp> copy = new ArrayList<PExp>(node.getArgs()); 
    for(PExp e : copy) 
    { 
     e.apply(this); 
    } 
} 
outAMethodExp(node); 

में घुंघराले ब्रेसिज़ का उपयोग करता है क्या उन स्टैंड-अलोन पहले if बयान के बाद घुंघराले ब्रेसिज़ मतलब है है?

उत्तर

105

अतिरिक्त ब्रेसिज़ का एकमात्र उद्देश्य स्कोप-सीमा प्रदान करना है। List<PExp> copy केवल उन ब्रेसिज़ के भीतर मौजूद होगा, और उनमें से बाहर कोई गुंजाइश नहीं होगा।

यदि यह जेनरेट कोड है, तो मुझे लगता है कि कोड जनरेटर ऐसा करता है, इसलिए यह चिंता करने के बिना कुछ कोड (जैसे इस) को डाल सकता है कि यह List<PExp> copy कितनी बार डाला गया है और संभावित रूप से नामकरण के बारे में चिंता किए बिना वेरिएबल्स अगर यह स्निपेट एक ही विधि में एक से अधिक विधि में डाला जाता है।

+5

एक अतिरिक्त "लाभ" इस मामले में है कि 'copy' कचरा से पहले' outAMethodExp() 'रिटर्न एकत्र किया जा सकता है। यदि यह एक लंबी दौड़ या स्मृति-गहन कॉल है, तो यह सहायक हो सकता है। मैंने उद्धरणों में "लाभ" लगाया क्योंकि अलग-अलग तरीकों से पुन: काम करना आम तौर पर इस वाक्यविन्यास का लाभ लेने से अधिक स्वच्छ और स्पष्ट है। – dimo414

+0

दरअसल, एक चर को स्कॉइंग करना ** ** ** कचरा संग्रह पर प्रभाव नहीं डालता है। सभी आधुनिक जेवीएम में मुझे पता है, जेआईटी यह निर्धारित कर सकता है कि ब्रेक जैसे स्कोपिंग संरचनाओं की उपस्थिति या अनुपस्थिति के बावजूद कोई वस्तु जीसी के लिए योग्य है। –

2

वे एक आंतरिक गुंजाइश बनाते हैं। इन ब्रेसिज़ के अंदर घोषित वैरिएबल उनके बाहर दिखाई नहीं दे रहा है। यह सी/सी ++ पर भी लागू होता है।

0

मुझे लगता है कि वे सिर्फ एक अज्ञात स्तर के दायरे को परिभाषित करते हैं।

0

वे एक नया दायरा परिभाषित करते हैं जिसका अर्थ है कि इस दायरे में घोषित सब कुछ घुंघराले ब्रेसिज़ के बाहर दिखाई नहीं दे रहा है।

4

मैं वास्तव में लगता है कि होता है कि किसी एक किसी और बयान भूल गया।

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

+2

मैं आपको बस इतना ही मतदान कर रहा हूं क्योंकि ऐसा हो सकता है, हुआ है, और ओकम उसकी कब्र में घुमा रहा है क्योंकि आपको वोट दिया गया था। :) – willasaywhat

+1

यह SableCC द्वारा उत्पन्न किया गया है। मैं 5 डॉलर शर्त लगाता हूं वे –

+0

नहीं भूलते हैं अतिरिक्त ब्रेसिज़ ग्लोबल वैरिएबल को एक लंबी विधि में आपके ऊपर रेंगने से रोकने के लिए उपयोगी होते हैं, जहां आप एक ही स्थान पर कुछ समान कोड ब्लॉक रखना चाहते हैं, जहां ब्लॉक नहीं हैं नए तरीकों की गारंटी देने के लिए पर्याप्त जटिल। – jayunit100

0

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

0

एक दिलचस्प नोट के रूप में: ब्रेसिज़ वास्तव में बयानों की एक कक्षा को सक्षम करते हैं: घोषणाएं।

यह गैर कानूनी है: if(a) int f;

लेकिन यह कानूनी है: if(a) { int f; }

+0

बिल्कुल यह कोड बेकार है, आप ब्रेसिज़ के बाहर f को देखने में सक्षम नहीं होंगे। और इसका उपयोग करने के लिए आपको इसे एक ही दायरे में घोषित करने और उपयोग करने की आवश्यकता है। तो आपको एक से अधिक कथन की आवश्यकता है, इसलिए आपको ब्रेसिज़ की आवश्यकता है। –

+0

यह संकलक जांच का बिंदु है जिसका मैं उल्लेख कर रहा हूं। मुझे यह दिलचस्प लगता है कि "अंतर्निहित दायरा" में एक अंतर है (जिसे मैं प्रत्येक एक-लाइनर को ब्रेसिज़ के बिना मानता हूं) और स्पष्ट वाले। यह भूलना आसान है कि संकलक एक फर्क पड़ता है। – Hugo

+0

अगर (userWantsTocInReport) {new Toc (report};} के बारे में क्या है? मैं यह नहीं कह रहा हूं कि यह लिखने का आदर्श तरीका है, लेकिन किसी भी कारण से किसी को भी चुन सकता है। – user625488

24

मैं मैट ख दूसरा क्या लिखा है, और मैं जोड़ देंगे कि एक और उपयोग मैं गुमनाम ब्रेसिज़ के देखा है एक अंतर्निहित घोषित करने के लिए है अज्ञात कक्षाओं में कन्स्ट्रक्टर। उदाहरण के लिए:

List<String> names = new ArrayList<String>() { 
    // I want to initialize this ArrayList instace in-line, 
    // but I can't define a constructor for an anonymous class: 
     { 
     add("Adam"); 
     add("Eve"); 
     } 

    }; 

कुछ इकाई परीक्षण चौखटे एक अन्य स्तर पर, करता है जो कुछ चालाक बातें जो पूरी तरह काम करने के लिए uncompilable देखने के अनुमति देने के लिए इस वाक्य ले लिया है। चूंकि वे अपरिचित लग , मैं इस तरह के एक बड़े प्रशंसक अपने आप नहीं कर रहा हूँ, लेकिन यह कम से कम पहचान करता है, तो आप इस प्रयोग के पार चला क्या हो रहा है सार्थक है।

+0

मुझे खेद है, मैं नहीं चाहता इस कोड को समझें। क्या एक वर्ग या फ़ंक्शन "जोड़ें" है। यदि यह एक फ़ंक्शन है: यह किस वर्ग से संबंधित है? क्या इस मामले में ऐरेलिस्ट एक प्रतिनिधि प्रकार को स्वीकार कर रहा है? –

+7

"एड" एक फ़ंक्शन है। घुंघराले के भीतर सामान ब्रेसिज़ को कुछ प्रारंभिक प्रारंभ करने के लिए कन्स्ट्रक्टर के समक्ष बुलाया जाता है। आप http://www.c2.com/cgi/wiki?DoubleBraceInitialization और अधिक के लिए देख सकते हैं। –

+1

तकनीकी रूप से, निर्माता को पहले कॉल किया जाता है और इंस्टेंस प्रारंभिक ब्लॉक तुरंत कॉल किया जाता है 'सुपर (...) ' – Oli

7

मैं स्कोप सीमा उत्तर से सहमत हूं, लेकिन एक चीज़ जोड़ूंगा।

कभी कभी तुम जो लोग अपने कोड के वर्गों गुना चाहते और संपादकों कि ब्रेसिज़ स्वचालित रूप से गुना होगा की कोड में ऐसे ही एक निर्माण को देखते हैं। वे इसका इस्तेमाल तार्किक वर्गों है कि एक समारोह, वर्ग, पाश, आदि है कि आम तौर पर तह किया जा जाएगा में गिर नहीं है में अपने कोड मोड़ें करने के लिए।

0

इसका उपयोग initialization blocks के लिए भी किया जाता है।

+0

पर कॉल करने के बाद शायद यह उल्लेख करने लायक है कि यह केवल कन्स्ट्रक्टर के बाहर स्थिर वर्ग प्रारंभिकता के लिए है। ओपीएस कोड स्निपेट एक विधि ब्लॉक में है (केवल संभव pl इसके लिए ऐस)। – mmoore

+0

एक प्रारंभिक ब्लॉक स्थैतिक वर्ग प्रारंभिकरण के लिए है यदि यह 'स्थिर 'से पूर्ववत है अन्यथा यह _instance_ प्रारंभिक ब्लॉक है। – Gabriel

+0

सही कहानियां। स्पष्टीकरण के लिए धन्यवाद। – mmoore

0

ब्रेसेस स्विच/केस स्टेटमेंट में दायरे को कम करने के लिए भी उपयोगी हैं।

switch(foo) { 
    case BAR: 
    int i = ... 
    ... 
    case BAZ: 
    int i = ... // error, "i" already defined in scope 
} 

लेकिन आप लिख सकते हैं

switch(foo) { 
    case BAR:{ 
    int i = ... 
    ... 
    } 
    case BAZ:{ 
    int i = ... // OK 
    } 
}