2009-10-13 9 views
34

प्राइमेटिव सहित स्थानीय चर, हमेशा जावा में प्रारंभ क्यों किया जाना चाहिए? उदाहरण चर के मामले में ऐसा क्यों लागू नहीं है?प्राइमेटिव सहित स्थानीय चर, हमेशा जावा में प्रारंभ क्यों किया जाना चाहिए?

+0

अनियमित स्थानीय चर घोषित करना संभव है लेकिन इसका उपयोग संभव नहीं है :) – kokabi

उत्तर

54

question about this very recently for C# था ... - वहां भी उत्तर पढ़ें, क्योंकि यह मूल रूप से वही बात है। आपको Eric Lippert's recent blog post दिलचस्प भी मिल सकता है; यह कम से कम उसी क्षेत्र के आसपास है, भले ही इसमें कुछ अलग जोर हो।

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

अब यह स्थानीय चर के लिए ठीक है - लेकिन उदाहरण के लिए और स्थैतिक चर, संकलक के पास आदेश को जानने का कोई तरीका नहीं है जिसमें विधियों को बुलाया जाएगा। क्या संपत्ति "सेटर" को "गेटटर" से पहले बुलाया जाएगा? इसका ज्ञान जानने का कोई तरीका नहीं है, इसलिए इसका खतरा आपको सतर्क करने का कोई तरीका नहीं है। यही कारण है कि डिफ़ॉल्ट मान उदाहरण/स्थैतिक चर के लिए उपयोग किए जाते हैं - कम से कम आपको उस समय स्मृति में होने वाली किसी भी चीज़ के बजाय एक ज्ञात मान (0, झूठी, शून्य आदि) प्राप्त होगा। (यह संवेदनशील डेटा को पढ़ने की संभावित सुरक्षा समस्या को भी हटा देता है जिसे स्पष्ट रूप से मिटाया नहीं गया था।)

+0

जो मुझे समझ में नहीं आता है, यदि कोई ऑब्जेक्ट डिफ़ॉल्ट रूप से शून्य है, तो आपको इसे शून्य पर क्यों असाइन करना होगा? मुझे लगता है कि जावा भाषा के लोगों ने फैसला किया कि उस मामले में स्पष्ट होना बेहतर था, लेकिन मुझे यकीन नहीं है कि मैं सहमत हूं। –

+5

एक वस्तु शून्य नहीं है। एक * चर * शून्य हो सकता है, लेकिन एक वस्तु नहीं। और एक स्थानीय चर * के पास डिफ़ॉल्ट मान नहीं है ... ठीक है क्योंकि इसका मतलब यह नहीं है कि इसे पढ़ने से पहले इसे एक उपयोगी मूल्य देने के लिए मजबूर होना पड़ता है। यदि आप उस मान को शून्य बनाना चाहते हैं, तो यह ठीक है ... लेकिन मुझे संकलक पसंद है अगर मैं कुछ ऐसा पढ़ने की कोशिश कर रहा हूं जो प्रारंभिक नहीं हो सकता है ... –

+0

@ जोन आपका क्या मतलब है "यह भी संवेदनशील डेटा पढ़ने की संभावित सुरक्षा समस्या को हटा देता है जिसे स्पष्ट रूप से मिटाया नहीं गया था। " ? क्या आप कृपया थोड़ा सा समझा सकते हैं? – Geek

1

स्थानीय चर और प्राइमेटिव को उपयोग से पहले प्रारंभ किया जाना चाहिए क्योंकि आपको पता होगा कि मूल्यों से क्या अपेक्षा की जानी चाहिए। ऐतिहासिक रूप से, जब एक नया चर बनाया गया था तो इसमें स्मृति से यादृच्छिक मान होंगे [और कोई मूल्य की भविष्यवाणी नहीं कर सकता]। जावा को भी इसकी आवश्यकता होती है क्योंकि यह अनाथ चर की उपस्थिति को रोकती है।

0

अभ्यास में सभी चरों का उपयोग करने से पहले उन्हें प्रारंभ करने की आवश्यकता है।

मैं उस समय के बारे में नहीं सोच सकता जब आप इसके मूल्य को सेट करने से पहले एक चर का उपयोग करना चाहते हैं (जब तक कि आप इसे शून्य के साथ तुलना नहीं कर रहे हों)।

7

ठीक है, स्थानीय चर के मामले में यह स्पष्ट है कि इसका अर्थ 'पहले' से है क्योंकि घोषणा (विधि में) और संदर्भ के बीच कार्यक्रम प्रवाह अनुक्रमिक है। विधि संकलक के बाहर घोषित फ़ील्ड के मामले में कभी नहीं पता कि कौन सा कोड उपयोग किया जा रहा है, इसलिए जब यह कोई त्रुटि उत्पन्न नहीं कर सकता है, संभवतः कुछ अन्य विधि इसका उपयोग करने से पहले फ़ील्ड को प्रारंभ करने जा रही है।

+0

+1 "घोषणा (विधि में) के बीच कार्यक्रम प्रवाह और संदर्भ अनुक्रमिक है।" – luigi7up

3

पूरी तरह से सच नहीं है। स्थानीय चर केवल संदर्भ होने पर प्रारंभ करने की आवश्यकता है। यदि कभी संदर्भित नहीं किया गया तो स्थानीय चर को अनियमित किया जा सकता है। उदाहरण के लिए:

int x; // Valid 
int y; 
println("y=" + y); // Not valid since y's value has never been assigned 
6

जावा में, वर्ग और उदाहरण चर एक डिफ़ॉल्ट मान (शून्य, 0, गलत) अगर वे मैन्युअल रूप से प्रारंभ नहीं कर रहे हैं मान। हालांकि, स्थानीय चर के पास डिफ़ॉल्ट मान नहीं है। जब तक एक स्थानीय चर को एक मान असाइन नहीं किया गया है, तो संकलक उस कोड को संकलित करने से इंकार कर देगा जो इसे पढ़ता है। आईएमएचओ, यह निष्कर्ष निकाला जाता है, जो स्थानीय चर को कुछ डिफ़ॉल्ट मान (जैसे शून्य, जो बाद में एक नलपोइंटर एक्सेप्शन का कारण बन सकता है) के साथ शुरू होता है, जब यह घोषित किया जाता है तो वास्तव में एक बुरी चीज है। निम्न उदाहरण पर विचार करें:

Object o; 
if (<some boolean condition>) 
    o = <some value>; 
else 
    o = <some other value>; 
System.out.println(o); 

अशक्त साथ o का एक आरंभीकरण पूरी तरह से अनावश्यक है, संकलन समय पर जावा कम्पाइलर चेकों के बाद से, कि किसी भी कोड-पथ o initializes से पहले (या तो शून्य या कुछ गैर शून्य मान के साथ) चर पढ़ा जाता है।इसका मतलब है कि संकलक System.out.println(o); को संकलित करने से इनकार कर देगा यदि आप उपरोक्त कोड स्निपेट में परिवर्तनीय o के दो प्रारंभिकताओं में से किसी एक को टिप्पणी करेंगे।

यह जावा के लिए है, और शायद जावा के लिए भी हो सकता है। मुझे सी # जैसी भाषा के बारे में पता नहीं है। अच्छे पुराने सी (और शायद सी ++) में, फिर भी, जब भी उन्हें घोषित करते समय वैरिएबल प्रारंभ करना अनुशंसा की जाती है, AFAIK। ऐसी "पुरानी स्कूल" प्रोग्रामिंग भाषाएं कारण हो सकती हैं कि जावा को आधुनिक भाषाओं के बारे में किताबों और चर्चाओं में हमेशा वैरिएबल शुरू करने की सिफारिश पॉप-अप होती है, जहां संकलन ट्रैक करता है कि एक चर प्रारंभ किया गया है या नहीं।

+0

"पुरानी-स्कूल" भाषाएं एक वैरिएबल घोषित करने की अनुशंसा नहीं करती जब तक कि आपके पास कोई मूल्य न हो। :-) –

+0

ऊपर दिए गए उदाहरण पर विचार करें। यदि मूल्य एक जटिल के परिणाम पर निर्भर करता है तो मूल्य एक चर में डाल करने के लिए आपके पास मूल्य कैसे हो सकता है। आईएमएचओ, आपके द्वारा प्रस्तावित नियम में बड़ी समस्या है। – Sven

+0

यदि मान को कुछ जटिल कंप्यूटेशंस की आवश्यकता है, तो आप उन्हें एक अलग फ़ंक्शन में डाल सकते हैं और फ़ंक्शन कॉल को प्रारंभकर्ता के रूप में उपयोग कर सकते हैं। –

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

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