2009-09-03 23 views
41

{{ ... }} ब्लॉक निम्नलिखित कोड में क्या मतलब है?नई कक्षा का अर्थ (...) {{...}} प्रारंभिक idiom

class X { 

    private Y var1; 

    private X() { 
     Z context = new Z(new SystemThreadPool()) {{ 
      var1 = new Y(); 
     }}; 
    } 

} 
+5

मुझे लगता है कि डबल ब्रेसिज़ के लिए Google के लिए आसान नहीं है। –

+3

@ टॉम हौटिन: आप इसके बजाय "डबल ब्रेस" के लिए Google कर सकते हैं ... –

उत्तर

62

इसे double curly brace initialization कहा जाता है। (संपादित करें: लिंक हटा दिया गया, archived here)

इसका मतलब है कि आप एक अनाम उपclass बना रहे हैं और डबल ब्रेसिज़ के भीतर कोड मूल रूप से एक निर्माता है। इसे अक्सर संग्रह में सामग्री जोड़ने के लिए उपयोग किया जाता है क्योंकि अनिवार्य रूप से संग्रह स्थिरांक बनाने के लिए जावा का वाक्यविन्यास कुछ हद तक अजीब है।

तो तुम क्या कर सकते हैं:

List<String> list = new ArrayList<String>() {{ 
    add("one"); 
    add("two"); 
    add("three"); 
}}; 

के बजाय:

List<String> list = new ArrayList<String>(); 
list.add("one"); 
list.add("two"); 
list.add("three"); 

मैं वास्तव में उस तरह नहीं है और ऐसा करने के लिए पसंद करते हैं:

List<String> list = Arrays.asList("one", "two", "three"); 

तो यह नहीं करता है ' टी उस मामले में ज्यादा समझ में नहीं आता है, जबकि यह कहता है, मैप्स, जिसमें सुविधाजनक सहायक नहीं है।

+0

@skaffman यह "द्रव जावा" (http://codeLp/jatl) जैसे "द्रव जावा" में बहुत उपयोगी है। प्रयास किए गए। –

+6

ध्यान दें कि Arrays.asList() java.util.Arrays.ArrayList.ArrayList देता है और java.util.ArrayList नहीं है, जिसमें सीमित कार्यक्षमता है। – Asaf

+3

यह तकनीक मुश्किल है और कुछ चेतावनी है। किसी भी अच्छे कारण के बिना टूटा हुआ बराबर() अनुबंध या स्मृति उपयोग में वृद्धि करना संभव है। डबल ब्रेस प्रारंभिकरण से बचने के लिए बेहतर है जबतक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। अधिक जानकारी के लिए [इस] (http://www.ayp-sd.blogspot.com/2012/12/double-brace-initialization-in-java.html) पोस्ट देखें। –

11

"बाहरी" ब्रेसिज़ का मतलब है कि आप एक अज्ञात सबक्लास बना रहे हैं, दूसरी ब्रेसिज़ ऑब्जेक्ट प्रारंभकर्ता हैं। प्रारंभकर्ता वर्ग के कन्स्ट्रक्टर से पहले चलाया जाता है, लेकिन super कॉल के बाद (और इसलिए किसी भी सुपरक्लस प्रारंभकर्ता के बाद भी)। आप गैर-अज्ञात वर्गों में प्रारंभकर्ताओं का भी उपयोग कर सकते हैं, जो कि final फ़ील्ड शुरू करने का एक सुविधाजनक तरीका है यदि आपके पास कई रचनाकार हैं जो एक-दूसरे को कॉल नहीं कर सकते हैं, या फ़ील्ड जिन्हें सामान्य फ़ील्ड प्रारंभकर्ताओं की तुलना में अधिक जटिल प्रारंभिक आवश्यकता होती है। प्रारंभकर्ता एक जाँच अपवाद फेंक कर सकते हैं

class X extends Y{ 
    private final int lulz; 

    private static boolean someCondition(){...} 
    private static boolean danger() throws SomeException { ... } 
    { // initalizer -- might throw SomeException! 
     lulz = someCondition()? danger() : 0; 
    } 
    public X(A a) throws SomeException { super(a); } 
    public X(B b) throws SomeException { super(b); } 
} 

, सभी निर्माताओं की घोषणा करनी चाहिए कि वे इसे फेंक कर सकते हैं:

class X extends Y{ 
    private final int lulz; 

    private static boolean someCondition(){...} 
    private static boolean danger() throws SomeException { ... } 
    public X(A a) throws SomeException { 
     super(a); 
     lulz = someCondition()? danger() : 0; 
    } 
    public X(B b) throws SomeException { 
     super(b); 
     lulz = someCondition()? danger() : 0; 
    } 
} 

यह के रूप में लिखा जा सकता है:

इस वर्ग पर विचार करें।

4

आप एक anonymous class पैदा कर रहे हैं और class Instance initialize आर मुहावरा उपयोग करते हुए, इस तरह:

class X { 
    private Y var1; 

    private X() { 
     Z context = new Z(
       new SystemThreadPool()) { 
        {      // This is the initialize idiom 
         var1 = new Y();  // 
        }      // 
       } 
     ); // BTW you are missing ")" 
    } 
} 
1

पिछले जवाब में उल्लेख किया है, डबल घुंघराले ब्रेस प्रारंभ सही है।

यह पर एक विशिष्ट तकनीक का उपयोग करता है जिसमें जावा में इंस्टेंस सदस्यों प्रारंभ करना। क्लास परिभाषा में परिभाषित करने के लिए यह एक शॉर्टेंड तरीका है, कोड का एक साझा ब्लॉक जो तब भी चलाएगा जब किसी भी वर्ग कन्स्ट्रक्टर को सक्रिय किया जाता है।

मैं इस विषय पर अधिक व्यापक दृश्य के लिए official Java documentations का लिंक जोड़ रहा हूं।

से

documentation:

उदाहरण चर के लिए प्रारंभकर्ता ब्लॉक देखने के सिर्फ स्थिर प्रारंभकर्ता ब्लॉक की तरह है, लेकिन बिना static मुख्य शब्द:

{

// whatever code is needed for initialization goes here 

}

जावा कंपाइलर प्रतियां प्रारंभकर्ता ब्लॉक int ओ हर कन्स्ट्रक्टर। इसलिए, इस दृष्टिकोण का उपयोग एकाधिक रचनाकारों के बीच कोड के ब्लॉक को साझा करने के लिए किया जा सकता है।

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