में जावा के छिपे हुए विशेषताएं शीर्ष जवाब का उल्लेख है धनुकोष्ठक प्रारंभ , एक साथ बहुत आकर्षक वाक्य रचना:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
यह मुहावरा एक गुमनाम आंतरिक वर्ग बनाता है जिसमें सिर्फ एक उदाहरण इनिशलाइज़र है, जो "किसी भी [...] विधियों का उपयोग कर सकता है।
मुख्य प्रश्न: क्या यह उतना ही अक्षम है जितना यह लगता है? क्या इसका उपयोग एकबारगी आरंभ तक सीमित होना चाहिए? (और जाहिर है दिखावा!)
दूसरा प्रश्न: नए हैशसेट का उपयोग "इस" उदाहरण के इनिशलाइज़र में किया जाना चाहिए ... क्या कोई तंत्र पर प्रकाश डाल सकता है?
तीसरा प्रश्न: क्या यह मुहावरा भी उत्पादन कोड में उपयोग करने के लिए अस्पष्ट है?
सारांश: बहुत, बहुत अच्छा जवाब, सभी को धन्यवाद। प्रश्न (3) पर, लोगों को लगा कि वाक्यविन्यास स्पष्ट होना चाहिए (हालांकि मैं एक सामयिक टिप्पणी की सिफारिश करूंगा, खासकर यदि आपका कोड डेवलपर्स से गुजर जाएगा, जो इससे परिचित नहीं हो सकते हैं)।
प्रश्न (1) पर, उत्पन्न कोड जल्दी से चलना चाहिए। अतिरिक्त .class फ़ाइलें जार फ़ाइल अव्यवस्था का कारण बनती हैं, और धीमी गति से प्रोग्राम स्टार्टअप को थोड़ा सा (उस मापने के लिए @coobird के लिए धन्यवाद)। @ थिलो ने बताया कि कचरा संग्रह प्रभावित हो सकता है, और अतिरिक्त भार वाले वर्गों के लिए मेमोरी लागत कुछ मामलों में एक कारक हो सकती है।
प्रश्न (2) मेरे लिए सबसे दिलचस्प निकला। अगर मैं जवाबों को समझता हूं, तो डीबीआई में जो हो रहा है, वह यह है कि अनाम आंतरिक वर्ग नए ऑपरेटर द्वारा बनाई जा रही वस्तु के वर्ग का विस्तार करता है, और इसलिए इसका निर्माण किया जा रहा उदाहरण संदर्भित "यह" मान है। बहुत साफ़।
कुल मिलाकर, DBI ने एक बौद्धिक जिज्ञासा के रूप में मुझ पर प्रहार किया। Coobird और अन्य बताते हैं कि आप Arrays.asList, varargs के तरीकों, Google संग्रह और प्रस्तावित Java 7 संग्रह शाब्दिक के साथ समान प्रभाव प्राप्त कर सकते हैं। नई JVM स्कैला, JRuby, और ग्रूवी जैसी भाषाएं भी सूची निर्माण के लिए संक्षिप्त अधिसूचनाएं प्रदान करती हैं, और जावा के साथ अच्छी तरह से हस्तक्षेप करती हैं। यह देखते हुए कि डीबीआई क्लासपाट को बंद कर देता है, क्लास लोडिंग को थोड़ा धीमा कर देता है, और कोड को अधिक अस्पष्ट बनाता है, मैं शायद इससे दूर हटूंगा। हालाँकि, मैं इसे एक ऐसे दोस्त पर बसाने की योजना बना रहा हूँ, जो अपने SCJP को प्राप्त कर चुका है और जावा शब्दार्थ के बारे में अच्छे स्वभाव वाले जत्थों से प्यार करता है! ;-) सभी को धन्यवाद!
7/2017: बाल्डुंग में डबल ब्रेस आरंभीकरण का अच्छा सारांश है और इसे एक विरोधी पैटर्न मानता है।
12/2017: @Basil Bourque ध्यान दें कि नए जावा 9 में आप कह सकते हैं:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
यह निश्चित रूप से जाने का रास्ता है। यदि आप पहले के संस्करण के साथ फंस गए हैं, तो Google संग्रह 'ImmutableSet पर एक नज़र डालें ।
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
एक होने की उम्मीद करेंगेHashSet
, लेकिन अफसोस कि यह एक गुमनाम उपवर्ग है।