2013-06-20 7 views
9

मैं समझता हूं कि जावा प्राइमेटिव के पास प्रारंभिक प्रारंभिक मान हैं; उदाहरण के लिए 0int के लिए।प्राइमेटिव्स का स्पष्ट प्रारंभ

मेरे शोध से ऐसा लगता है कि मुझे इन मूल्यों पर भरोसा नहीं करना चाहिए। क्या मुझे हमेशा एक स्पष्ट प्रारंभिकरण प्रदान करना चाहिए और यदि हां, तो कहां?

public class Calculator { 

// Initialize value where it's declared? 
private int value; 

public Calculator() { 
    // Initialize value in constructor? 
} 

public void add(int other) { 
    value += other; 
} 
} 
+5

"मेरे शोध से ऐसा लगता है कि मुझे इन मूल्यों पर भरोसा नहीं करना चाहिए" <- उह? भाषा विनिर्देश आपके लिए एक विश्वसनीय स्रोत पर्याप्त नहीं है? – fge

+2

यह अन्य प्रोग्रामर को स्पष्ट करने के बारे में मूल्यों और अधिक पर भरोसा करने के बारे में कम है कि आप किस मूल्य का उपयोग कर रहे हैं। –

+0

यदि आपको डिफ़ॉल्ट मान की आवश्यकता नहीं है और तार्किक रूप से आपकी कक्षा के प्रत्येक उदाहरण में कम से कम एक विशेष मान पर सेट आवृत्ति चर होना चाहिए, तो आप उसके लिए कन्स्ट्रक्टर का उपयोग कर सकते हैं। – NINCOMPOOP

उत्तर

4

जावा द्वारा उत्पादित डिफ़ॉल्ट मानों का उपयोग करना बिल्कुल ठीक है, आपको अपने class के उदाहरण या static फ़ील्ड को स्पष्ट रूप से प्रारंभ करने की आवश्यकता नहीं है। जावा भाषा विशिष्टता के लिए इसकी आवश्यकता है, इसलिए भाषा के किसी भी कार्यान्वयन का पालन करना चाहिए। दूसरे शब्दों में, यदि आप सदस्य चर के डिफ़ॉल्ट मानों का उपयोग करते हैं तो आपका कोड 100% पोर्टेबल रहेगा। यह आदिम और संदर्भ प्रकार दोनों पर लागू होता है (बाद में null के साथ प्रारंभ किया जाता है)।

अधिक जानकारी के लिए Java Language Specification, पृष्ठ 81 देखें।

4.12।चर

एक कार्यक्रम में हर चर के 5 प्रारंभिक मान एक मूल्य से पहले अपने मूल्य प्रयोग किया जाता है होना चाहिए: - प्रत्येक वर्ग चर, उदाहरण चर, या सरणी घटक जब यह बनाई गई है एक डिफ़ॉल्ट मान के साथ आरंभ नहीं हो जाता

,

एक स्थानीय चर स्पष्ट रूप से एक मूल्य दिया जाना चाहिए इससे पहले कि यह प्रयोग किया जाता है, एक तरीका है कि कर सकते हैं या तो प्रारंभ या असाइनमेंट द्वारा:

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

हालांकि, स्थानीय को प्रारंभ करने में विफलता एक संकलन-समय त्रुटि है, इसलिए संकलक आपके प्रोग्राम को चलाने से पहले प्रत्येक लापता प्रारंभिकता को इंगित करेगा।

0

निर्माता में चर प्रारंभ अगर आप इस बारे में वास्तव में चिंतित हैं:

यहाँ मेरी कार्यक्रम का हिस्सा है। हालांकि, मैंने शून्य के अलावा किसी अन्य चीज़ के लिए प्रारंभिक संख्यात्मक प्रारंभिक कभी नहीं देखा है।

मुझे लगता है कि अगर आप कुछ कस्टम (और खराब) JVM के साथ काम कर रहे थे तो आपको केवल इसके बारे में चिंता करने की आवश्यकता होगी।

1

मेरे शोध से ऐसा लगता है कि मुझे इन मूल्यों पर भरोसा नहीं करना चाहिए।

आप उन पर भरोसा कर सकते हैं। कोई नुकसान नहीं होगा, क्योंकि यह डिफ़ॉल्ट रूप से किया जाता है जैसा कि आप पहले ही जानते हैं।

क्या मुझे हमेशा एक स्पष्ट प्रारंभिकरण प्रदान करना चाहिए और यदि ऐसा है, तो?

प्राइमेटिव के लिए, स्पष्ट प्रारंभिकरण प्रदान करने के लिए आवश्यक नहीं है, और मैं नहीं करना पसंद करता हूं। मैं शायद ही कभी करता हूं और लोगों को प्रारंभिक चर के लिए int i = 0; जैसे प्रारंभिक कार्य करने के लिए देखता हूं। लेकिन, यदि आप स्थानीय चर के बारे में बात कर रहे हैं, तो आपको उन्हें स्पष्ट मान देना होगा। चूक वहाँ निहित नहीं हैं।

लेकिन जब मामला गैर पुरातन के लिए आता है, तो आप एक स्पष्ट प्रारंभ करना चाहिए, या तो घोषणा के बिंदु पर, या निर्माता के अंदर, के रूप में मान डिफ़ॉल्ट null, द्वारा जो कर रहे हैं NPE हो सकती है, अगर नहीं ध्यान रखा। घोषणा के बिंदु पर शुरू करने का लाभ यह है कि, आपको अपने प्रत्येक रचनाकारों में प्रारंभिकरण नहीं करना होगा।

+1

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

+0

@ एरिक्सन। हाँ सही। असल में मेरा मतलब था कि केवल। स्थानीय चर को घोषित करना अच्छा अभ्यास है जब आपको इसकी आवश्यकता होती है। जब आप किसी अजीब समस्या में फंस जाते हैं, तो यह बहुत काम बचाता है। कन्स्ट्रक्टर के बिना –

0

सदस्य चर डिफ़ॉल्ट मानों के साथ आरंभ किए जाएंगे। तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। लेकिन फिर भी यदि आप डिफ़ॉल्ट मानों या अन्य मानों के साथ प्रारंभ करना चाहते हैं तो आप उन्हें कन्स्ट्रक्टर

+0

: पब्लिक क्लास ए { सार्वजनिक int num = 2; सार्वजनिक शून्य ए() { } } –

+1

कन्स्ट्रक्टर में प्रारंभ करना बेहतर है। – stinepike

+0

यह हो सकता है। मैं बस अन्य विधि –

0

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

आपके द्वारा दिखाए गए कोड में मेरी व्यक्तिगत वरीयता घोषित होने पर चर को 0 तक प्रारंभ करना होगा। यह केवल इसलिए है क्योंकि चर पर पहला ऑपरेशन += है और मेरे लिए संख्यात्मक संचालन के लिए डिफ़ॉल्ट मान पर भरोसा करना गलत लगता है। इसके लिए कोई अच्छा कारण नहीं है क्योंकि यह ठीक काम करेगा क्योंकि यह गलत लगता है।

0

आप डिफ़ॉल्ट मानों के साथ जेवीएम आदिम प्रारंभिकता पर स्पष्ट रूप से भरोसा कर सकते हैं।


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

public class PrimitiveInitialization { 
    int i = 0; 
    int j; 
} 

अनुरूप बाईटकोड हो जाएगा

class PrimitiveInitialization { 
    I i 
    I j 

    public <init>()V 
    L0 
    LINENUMBER 8 L0 
    ALOAD 0 
    INVOKESPECIAL java/lang/Object.<init>()V 
    L1 
    LINENUMBER 10 L1 
    ALOAD 0 
    ICONST_0 
    PUTFIELD PrimitiveInitialization.i : I 
    RETURN 
    L2 
    LOCALVARIABLE this LPrimitiveInitialization; L0 L2 0 
    MAXSTACK = 2 
    MAXLOCALS = 1 
} 

हम देख सकते हैं कि स्पष्ट प्रारंभ चर i के लिए कुछ बाईटकोड संचालन जोड़ता है:

आप इस वर्ग है कहो।

उस ने कहा, आपको हमेशा कोड पठनीयता पसंद करना होगा, क्योंकि जेआईटी शायद रनटाइम पर इस प्रकार के बाइटकोड को अनुकूलित करने में सक्षम है।

0

डिफ़ॉल्ट मान भरोसेमंद हैं।


असल में वे कर रहे हैं स्पष्ट ज़ीरोइंग से "अधिक" भरोसेमंद, क्योंकि डिफ़ॉल्ट कार्य होता है-पहले सभी अन्य कार्यों।

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