डिट्टो विधेयक लालकृष्ण पर मैं जोड़ें:
जावा कम्पाइलर एक समारोह के भीतर उपयोग करने से पहले एक चर सेट करने में नाकाम रहने से अपने आप को चोट पहुँचाने से बचाने कर सकते हैं। इस प्रकार यह स्पष्ट रूप से डिफ़ॉल्ट मान निर्धारित नहीं करता है, क्योंकि बिल के वर्णन करता है।
लेकिन जब कक्षा चर की बात आती है, तो संकलक के लिए यह आपके लिए बहुत मुश्किल होगा। क्लास वेरिएबल क्लास में किसी भी फंक्शन द्वारा सेट किया जा सकता है। संकलक के लिए सभी संभावित आदेश निर्धारित करना बहुत मुश्किल होगा जिसमें कार्यों को बुलाया जा सकता है। कम से कम इसे सिस्टम में सभी कक्षाओं का विश्लेषण करना होगा जो इस कक्षा में किसी भी समारोह को कॉल करते हैं। इसे किसी भी डेटा फाइल या डेटाबेस की सामग्री की जांच करनी पड़ सकती है और किसी भी तरह भविष्यवाणी करनी चाहिए कि उपयोगकर्ता कौन से इनपुट बनाएंगे। सबसे अच्छा यह काम बेहद जटिल होगा, सबसे खराब असंभव पर। तो वर्ग चर के लिए, यह एक विश्वसनीय डिफ़ॉल्ट प्रदान करने के लिए समझ में आता है। डिफ़ॉल्ट रूप से, फ़ील्ड को शून्य के बिट्स के साथ भरने के लिए, इसलिए आप संदर्भों के लिए शून्य, पूर्णांक के लिए शून्य, बुलियन के लिए झूठी इत्यादि प्राप्त करते हैं।
जैसा कि बिल कहता है, आपको निश्चित रूप से स्वचालित रूप से आदत नहीं मिलनी चाहिए जब आप उन्हें घोषित करते हैं तो वैरिएबल प्रारंभ करना। केवल घोषणा कार्यक्रम में वैरिएबल प्रारंभ करें यदि यह वास्तव में आपके प्रोग्राम के संदर्भ में समझ में आता है। जैसे, 99% बार आप x को 42 होना चाहते हैं, लेकिन कुछ IF स्थिति के अंदर आप पाएंगे कि यह एक विशेष मामला है और x 666 होना चाहिए, फिर ठीक है, "int x = 42;" से शुरू करें और आईएफ के अंदर इसे ओवरराइड करें। लेकिन अधिक सामान्य मामले में, जहां आप किसी भी परिस्थिति के आधार पर मूल्य को समझते हैं, तो मनमाना संख्या में प्रारंभ न करें। बस इसे गणना मूल्य के साथ भरें।फिर यदि आप तर्क त्रुटि करते हैं और शर्तों के कुछ संयोजन के तहत मूल्य निर्धारित करने में असफल होते हैं, तो संकलक आपको बता सकता है कि आप उपयोगकर्ता की बजाय खराब हो गए हैं।
पी एस मैं लंगड़ा प्रोग्राम हैं जो तरह बातें कहते हैं की एक बहुत कुछ देखा है:
HashMap myMap=new HashMap();
myMap=getBunchOfData();
क्यों चर प्रारंभ करने के लिए जब आप जानते हैं कि आप तुरंत इस वस्तु की दूरी पर एक millisecond बाद में फेंक करने जा रहे हैं एक वस्तु बनाने के? यह सिर्फ समय की बर्बादी है।
संपादित
एक छोटी सी उदाहरण लेते हैं, मान लीजिए आप यह लिखा:
int foo;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
यह संकलन समय पर एक त्रुटि फेंक होगा, क्योंकि संकलक देखेंगे कि जब बार == 0, आपने कभी भी foo सेट नहीं किया है, लेकिन फिर आप इसका उपयोग करने का प्रयास करते हैं।
लेकिन अगर आप एक डमी मूल्य के लिए foo प्रारंभ, जैसे
int foo=0;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
फिर संकलक देखेंगे कि कोई बात नहीं क्या पट्टी के मूल्य, foo कुछ करने के लिए सेट हो जाता है, तो यह एक त्रुटि का उत्पादन नहीं होगा। यदि आप वास्तव में चाहते हैं कि फू 0 के लिए 0 है, तो बार 0 है, तो यह ठीक है। लेकिन अगर वास्तव में हुआ तो यह है कि आप < = या> = के लिए परीक्षणों में से एक का मतलब था या जब आप बार == 0 के लिए अंतिम फ़ाइनल शामिल करना चाहते थे, तो आपने संकलक को अपनी त्रुटि का पता लगाने में विफल होने में धोखा दिया है। और वैसे, इस तरह से मुझे लगता है कि ऐसा निर्माण खराब कोडिंग शैली है: न केवल संकलक यह सुनिश्चित कर सकता है कि आप क्या चाहते हैं, लेकिन भविष्य में रखरखाव प्रोग्रामर भी नहीं।
यह निर्णय क्यों लिया गया था? क्लास वेरिएबल्स की तरह उन्हें 'शून्य' क्यों न करें? –
शायद बेहतर कोड/पठनीयता के लिए? –
स्थानीय चर के डिफ़ॉल्ट होने के संबंध में कई स्टैक ओवरफ्लो प्रश्न हैं। जैसे http://stackoverflow.com/questions/415687/why-are-local-variables-not-initialized-in-java –