2013-03-06 14 views
5

जब मैं एक ठेकेदार के माध्यम से स्थिर सदस्यों को प्रारंभ कर सकता हूं तो मुझे स्थिर प्रारंभिक ब्लॉक का उपयोग क्यों करना चाहिए?मैं जावा में स्थिर प्रारंभिक ब्लॉक का उपयोग क्यों करूं?

+8

क्या होगा यदि आप उस वर्ग का एक उदाहरण है - लेकिन इसके स्थिर कार्यों का उपयोग करना चाहते हैं, जो स्थैतिक प्रारंभकर्ता ब्लॉक द्वारा शुरू किए गए मानों का उपयोग करते हैं? – ppeterka

+1

और जब भी c'tor कहा जाता है, स्थिर मान रीसेट हो जाएंगे। खराब!! – Azodious

उत्तर

3

सबसे पहले, आपके पास कभी भी आपकी कक्षा का कोई उदाहरण नहीं हो सकता है। या हो सकता है कि आप स्थिर सदस्यों को से पहले इनलाइलाइज्ड करना चाहें, आपके पास कक्षा का कोई भी उदाहरण है।

दूसरे, कंस्ट्रक्टर्स से स्थिर सदस्यों आरंभ अधिक काम है:

  • क्या आप वाकई हर निर्माता यह करता है कि बनाने के लिए की आवश्यकता होगी;
  • आपको स्थिर रखने के लिए ध्वज बनाए रखने की आवश्यकता है कि स्थिर सदस्यों को प्रारंभ किया गया है या नहीं;
  • आपको दौड़ की स्थिति को रोकने के लिए सिंक्रनाइज़ेशन के बारे में सोचना होगा;
  • आपको सिंक्रनाइज़ेशन के प्रदर्शन प्रभावों पर विचार करना पड़ सकता है, खासकर यदि आपके पास कई वर्ग हैं जो आपकी कक्षा के कई उदाहरण बनाते हैं।

अंत में, यह आमतौर पर धारणात्मक करने के लिए (मैं कहता हूँ "आमतौर पर" क्योंकि वहाँ आलसी आरंभीकरण के लिए वैध उपयोग हैं) गलत बात है।

+0

+1 - यद्यपि यदि आप आलसी (या गैर आलसी स्थगित) प्रारंभिकरण को लागू करने जा रहे थे, तो शायद आप एक कन्स्ट्रक्टर में "ऐसा नहीं करेंगे"। –

1

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

0

तो क्यों:

static Set<String> digits = new HashSet<String>(); 
static { 
    Collections.add(digits, "unu", "du", "tri", "kvar", "kvin"); 
    digits.add("ses"); 
    digits.add("sep"); 
    digits.add("ok"); 
} 

निम्नलिखित संभव है यदि:

static Set<String> digits = new HashSet<String>() {{ 
    Collections.add(this, "unu", "du", "tri", "kvar", "kvin"); 
    add("ses"); 
    add("sep"); 
    add("ok"); 
}}; 
  1. यह एक नई अज्ञात वर्ग, जार में एक फ़ाइल से परिचित करवाता है इतना इष्टतम नहीं है।
  2. दूसरा रूप एक geeky play thing है।
+0

नए अज्ञात वर्गों को इष्टतम क्यों नहीं पेश किया जा रहा है? क्या यह कभी भी क्लासलोडिंग बग का नेतृत्व करेगा? या आप बस इतना कह रहे हैं कि आप अपने जार को फुला नहीं चाहते हैं। –

+1

@ डेविड टी। मुझे किसी भी रूप के लिए कोई नापसंद नहीं है, लेकिन दोनों की तुलना में: पहले की संख्या में 'अंकों' की अनावश्यक घटनाएं होती हैं और दूसरा एक उदार वर्ग (छोटे ओवरहेड) बनाता है और गैर-जावा डेवलपर्स के लिए एक भ्रामक वाक्यविन्यास है। वास्तविक खतरे तब होगी जब एक गैर-स्थिर '{{...}} 'को एक सीरियलज़ेबल क्लास पर उपयोग किया जाता है: फिर आसपास के वर्ग के' इस 'को भी क्रमबद्ध किया जाता है। उदाहरण के लिए ऑब्जेक्ट को पुनः लोड करने के बाद मुझे इस तरह का 'एक्स। यह' शून्य नहीं हुआ है। –

+1

असल में, मुझे एक अंतर मिला -> ग्रहण पर, यदि आपको अपने बेनामी वर्ग के अंदर कोई दुर्घटना हो, तो ग्रहण भी यह नहीं जानता कि कौन सी परियोजना क्रैश की रेखा को इंगित करे (जैसे, कहें कि आपके पास धागे और रननेबल का समूह है अनाम वर्ग के रूप में) –

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