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


79

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

// 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बयान के मतलब के बाद उन स्टैंड-अलोन घुंघराले ब्रेसिज़ का क्या मतलब है?

जवाबों:


120

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

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


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

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

27

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

  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");
      }

  };

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


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

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

1
तकनीकी रूप से, कंस्ट्रक्टर को पहले कॉल किया जाता है और उदाहरण इनिशियलाइज़ेशन ब्लॉक को कॉल के तुरंत बाद कॉल किया जाता है super(...)
ओली

8

मैं स्कोप लिमिट के जवाब से सहमत हूं, लेकिन एक बात और जोड़ूंगा।

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


4

मैं वास्तव में अनुमान लगाऊंगा कि कोई और बयान भूल गया।

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


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

1
यह SableCC द्वारा निर्मित है। मैंने शर्त लगाई 5 $ वे और नहीं भूल गए
पावेल फेल्डमैन

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

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

मैंने आपको अपडाउन किया क्योंकि -1 वोट का मतलब है कि आपको भी भाग नहीं लेना चाहिए था। शायद आपको पता नहीं था, लेकिन आपने एक प्रयास में लगा दिया। मैं हर किसी के लिए ट्रॉफी के बारे में नहीं हूं, लेकिन "धन्यवाद" बस वही है जो मैं उन लोगों से कहता हूं जो मदद करने की कोशिश कर रहे हैं। (+1 == धन्यवाद)।
user426364

2

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


1

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

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
  }
}

1

इसका उपयोग आरंभीकरण ब्लॉकों के लिए भी किया जाता है ।


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

एक इनिशियलाइज़ेशन ब्लॉक स्टैटिक क्लास इनिशियलाइज़ेशन के लिए होता है अगर इसे प्रीफ़ेक्ट किया जाता है staticअन्यथा इसकी इंस्टेंस इनिशियलाइज़ेशन ब्लॉक।
गेब्रियल

सच्ची दास्ताँ। स्पष्टीकरण के लिए धन्यवाद।
13:54

0

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


0

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

यह अवैध है: if(a) int f;

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


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

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

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


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.