java - बूलियन अशक्त होने पर जावा की जाँच करें




performance boolean nullable (6)

boolean एक आदिम प्रकार है, और इसलिए अशक्त नहीं हो सकता है।

इसका बॉक्सिंग प्रकार, Boolean , अशक्त हो सकता है।

फ़ंक्शन संभवतः Boolean के विपरीत एक Boolean लौट रहा है, इसलिए Boolean टाइप चर के परिणाम को असाइन करने से आप अशक्तता के लिए परीक्षण कर पाएंगे।

आप कैसे जांचते हैं कि कोई बूलियन अशक्त है या नहीं? इसलिए अगर मुझे पता है कि "HideInNav" शून्य है। मैं इसे और क्रियान्वित करने से कैसे रोकूं? नीचे जैसा कुछ काम नहीं करता है, लेकिन क्यों?

boolean hideInNav = parent.getProperties().get("hideInNav", false);
String hideNavigation = hideInNav != null ? hideInNav : "";

null एक संदर्भ प्रकार को निर्दिष्ट एक मान है। null एक आरक्षित मूल्य है, यह दर्शाता है कि एक संदर्भ किसी वस्तु का उदाहरण नहीं है।

एक boolean एक वस्तु का एक उदाहरण नहीं है। यह एक आदिम प्रकार है, जैसे int और float । उसी तरह से: int x का मान 0 , boolean x का मान false


जावा में, null केवल वस्तु संदर्भों पर लागू होता है; चूंकि boolean एक आदिम प्रकार है, इसलिए इसे null नहीं सौंपा जा सकता है।

आपके उदाहरण से संदर्भ प्राप्त करना कठिन है, लेकिन मैं अनुमान लगा रहा हूं कि अगर hideInNav , hideInNav getProperties() , (डिफ़ॉल्ट मान?) द्वारा लौटाए गए ऑब्जेक्ट में नहीं है, तो आप false । मुझे संदेह है कि यह वह बग है जिसे आप देख रहे हैं, क्योंकि false null बराबर नहीं है, इसलिए hideNavigation लिए खाली स्ट्रिंग मिल रही है?

आपको अपने कोड नमूने के संदर्भ में कुछ और बेहतर जवाब मिल सकते हैं।


केवल एक चीज जो null हो सकती है वह है नॉन-प्राइमिव।

एक boolean जो केवल TRUE या FALSE को पकड़ सकता है वह एक आदिम है। मेमोरी में TRUE / FALSE वास्तव में संख्या ( 0 और 1 ) हैं

0 = FALSE

1 = TRUE

इसलिए जब आप किसी वस्तु को पलटाते हैं, तो यह अशक्त String str; // will equal null होगा String str; // will equal null String str; // will equal null

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

boolean isTrue; // will be 0

int i; // will be 0


जावा में एक boolean null नहीं हो सकता।

एक Boolean , हालांकि, null हो सकता है।

यदि एक boolean को एक मान नहीं सौंपा गया है (एक वर्ग के सदस्य कहते हैं) तो यह डिफ़ॉल्ट रूप से false होगा।


प्रतिनिधित्व करते समय संदर्भ हमेशा एक मान होता है, इससे कोई फर्क नहीं पड़ता कि आप किस भाषा का उपयोग करते हैं।

बॉक्स व्यू के बाहर हो रही है, आइए असेंबली या कुछ निम्न स्तरीय मेमोरी प्रबंधन देखें। सीपीयू स्तर पर किसी भी चीज का संदर्भ तत्काल एक मूल्य बन जाता है अगर यह स्मृति या सीपीयू रजिस्टरों में से एक को लिखा जाता है। (यही कारण है कि सूचक एक अच्छी परिभाषा है। यह एक मूल्य है, जिसका एक ही समय में एक उद्देश्य है)।

स्मृति में डेटा में एक स्थान होता है और उस स्थान पर एक मान (बाइट, शब्द, जो भी हो) होता है। असेंबली में हमारे पास कुछ स्थान (उर्फ वैरिएबल) का नाम देने का एक सुविधाजनक समाधान है , लेकिन कोड को संकलित करते समय, असेंबलर नामित स्थान के साथ नाम को प्रतिस्थापित करता है जैसे कि आपका ब्राउज़र आईपी पते के साथ डोमेन नाम बदल देता है।

कोर के नीचे यह किसी भी भाषा में किसी भी भाषा का प्रतिनिधित्व किए बिना तकनीकी रूप से असंभव है (जब यह तुरंत मूल्य बन जाता है)।

आइए कहें कि हमारे पास एक वैरिएबल फू है, इसकी जगह 47 वें बाइट मेमोरी में है और इसका वैल्यू 5 है। हमारे पास एक और वैरिएबल रेफ 2 फ़ू है जो स्मृति में 223 वें बाइट पर है, और इसका मान 47 होगा। यह Ref2Foo तकनीकी चर हो सकता है , कार्यक्रम द्वारा स्पष्ट रूप से बनाया नहीं है। यदि आप किसी अन्य जानकारी के बिना 5 और 47 देख रहे हैं, तो आप केवल दो मान देखेंगे । यदि आप उन्हें संदर्भ के रूप में उपयोग करते हैं तो पहुंचने के लिए 5हमें यात्रा करना है:

(Name)[Location] -> [Value at the Location]
---------------------
(Ref2Foo)[223]  -> 47
(Foo)[47]       -> 5

इस तरह कूद-टेबल काम करते हैं।

अगर हम फू के मूल्य के साथ एक विधि / कार्य / प्रक्रिया को कॉल करना चाहते हैं, तो भाषा और इसके कई विधि आमंत्रण मोड के आधार पर, चर को विधि में पास करने के कुछ संभावित तरीके हैं:

  1. 5 को सीपीयू रजिस्टरों में से एक में कॉपी किया जाता है (यानी ईएक्स)।
  2. 5 ढेर के लिए PUSHD हो जाता है।
  3. 47 को सीपीयू रजिस्टरों में से एक में कॉपी किया जाता है
  4. 47 ढेर के लिए PUSHD।
  5. 223 को सीपीयू रजिस्टरों में से एक में कॉपी किया जाता है।
  6. 223 ढेर के लिए PUSHD हो जाता है।

किसी मान के ऊपर प्रत्येक मामले में - मौजूदा मान की एक प्रति - बनाई गई है, अब यह इसे संभालने के लिए प्राप्त करने की विधि तक है। जब आप विधि के अंदर "फू" लिखते हैं, तो इसे या तो ईएक्स से पढ़ा जाता है, या स्वचालित रूप से डिफ्रेंस किया जाता है , या डबल डिफ्रेंस किया जाता है, प्रक्रिया इस बात पर निर्भर करती है कि भाषा कैसे काम करती है और / या फू किस प्रकार का निर्देश देता है। यह डेवलपर से तब तक छिपा हुआ है जब तक कि वह dereferencing प्रक्रिया को circumvents। इसलिए संदर्भ एक मान है जब प्रतिनिधित्व किया जाता है, क्योंकि संदर्भ एक मान है जिसे संसाधित किया जाना चाहिए (भाषा स्तर पर)।

अब हमने विधि को फू पास कर दिया है:

  • यदि 1. और 2. यदि आप फू ( Foo = 9) बदलते हैं तो यह केवल स्थानीय दायरे को प्रभावित करता है क्योंकि आपके पास मूल्य की एक प्रति है। विधि के अंदर से हम यह भी निर्धारित नहीं कर सकते कि मूल फू कहाँ स्थित था।
  • यदि 3. और 4. मामले में आप डिफ़ॉल्ट भाषा संरचनाओं का उपयोग करते हैं और Foo ( Foo = 11) को बदलते हैं, तो यह वैश्विक रूप से Foo को बदल सकता है (भाषा पर निर्भर करता है, यानी जावा या पास्कल की procedure findMin(x, y, z: integer; var m : integer); )। हालांकि अगर भाषा आपको अव्यवस्था प्रक्रिया को बाधित करने की अनुमति देती है, तो आप 47कह सकते हैं 49। उस बिंदु पर फू को बदल दिया गया लगता है, क्योंकि आपने इसे स्थानीय पॉइंटर बदल दिया है। और यदि आप विधि ( Foo = 12) के अंदर इस फू को संशोधित करना चाहते हैं तो आप शायद प्रोग्राम (उर्फ सेगफॉल्ट) के निष्पादन को FUBAR करेंगे क्योंकि आप उम्मीद से अलग स्मृति को लिखेंगे, आप निष्पादन योग्य रखने के लिए निर्धारित क्षेत्र को भी संशोधित कर सकते हैं प्रोग्राम और इसके लिए लिखना चल रहा कोड संशोधित करेगा (फू अब नहीं है 47)। लेकिन फू का मूल्य47वैश्विक रूप से नहीं बदला, केवल विधि के अंदर एक, क्योंकि 47विधि के लिए एक प्रति भी था।
  • 5 और 6. मामले में यदि आप 223विधि के अंदर संशोधित करते हैं तो यह 3 या 4 के समान मेहेम बनाता है। (एक पॉइंटर, जो अब खराब मान को इंगित करता है, जिसे फिर से पॉइंटर के रूप में उपयोग किया जाता है) लेकिन यह अभी भी एक स्थानीय है समस्या, 223 की प्रतिलिपि बनाई गई थी । हालांकि यदि आप अव्यवस्था Ref2Foo(यानी 223) तक पहुंचने में सक्षम हैं , तो इंगित मूल्य तक पहुंचने और संशोधित करने के लिए 47, कहें 49, यह वैश्विक स्तर पर फू को प्रभावित करेगा , क्योंकि इस मामले में तरीकों की प्रतिलिपि मिली है 223लेकिन संदर्भ 47केवल एक बार मौजूद है, और इसे बदलना करने के लिए 49हर नेतृत्व करेंगे Ref2Fooएक गलत मान के लिए डबल-dereferencing।

महत्वहीन विवरणों पर नाइटपिकिंग, यहां तक ​​कि भाषाएं जो पास-दर-संदर्भ करती हैं, वे कार्यों को मूल्यों को पास कर देंगे, लेकिन उन कार्यों को पता है कि उन्हें इसे संदर्भित उद्देश्यों के लिए उपयोग करना है। यह पास-द-रेफरेंस-ए-वैल्यू प्रोग्रामर से सिर्फ छिपा हुआ है क्योंकि यह व्यावहारिक रूप से बेकार है और शब्दावली केवल पास-बाय-रेफरेंस है

सख्त पास-बाय-वैल्यू भी बेकार है, इसका मतलब यह होगा कि जब भी हम सरणी के साथ एक विधि को तर्क के रूप में कॉल करते हैं तो एक 100 एमबीटी सरणी को प्रतिलिपि बनाना चाहिए, इसलिए जावा कठोर रूप से पास-दर-मूल्य नहीं हो सकता है। प्रत्येक भाषा इस विशाल सरणी (एक मान के रूप में) का संदर्भ देगी और या तो कॉपी-ऑन-राइट तंत्र को नियोजित करेगी यदि उस सरणी को विधि के अंदर स्थानीय रूप से बदला जा सकता है या विधि (जावा के रूप में) को वैश्विक स्तर पर सरणी को संशोधित करने की अनुमति देता है (से कॉलर का दृश्य) और कुछ भाषाएं संदर्भ के मूल्य को संशोधित करने की अनुमति देती हैं।

तो संक्षेप में और जावा की अपनी शब्दावली में, जावा पास-बाय-वैल्यू है जहां मूल्य हो सकता है: या तो वास्तविक मूल्य या एक मान जो संदर्भ का प्रतिनिधित्व करता है ।





java performance boolean nullable