2012-08-06 18 views
28

संभव डुप्लिकेट:
Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?अगर (बूलियन == गलत) बनाम अगर (बूलियन!)

this NotePadProvider sample code में, मैंने देखा है कि लेखक प्रपत्र चुना है:

if (values.containsKey(NoteColumns.CREATED_DATE) == false) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

ओवर:

if (!values.containsKey(NoteColumns.CREATED_DATE)) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

क्या अधिक तार्किक पर पहले फॉर्म का लाभ है?

+4

यह अधिक पठनीय है। –

+10

@ लुकास Knuth वास्तव में? मुझे लगता है कि विपरीत ... – ateiob

+0

संबंधित: [क्या यह स्पष्ट रूप से बुलियन स्थिरांक के खिलाफ तुलना करना बुरा है। यदि जावा में (बी == झूठा) है?] (http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false- i) – BalusC

उत्तर

51

"पठनीयता" के अलावा, नहीं। वे कार्यात्मक रूप से समकक्ष हैं।

+1

के अनुसार आगे बढ़ता है, मुझे लगता है कि यह पठनीयता तर्क से परे भी जाता है। ! (बैंग ऑपरेटर) इस उद्देश्य के लिए बनाया गया था। आपको इसका इस्तेमाल करना चाहिए क्योंकि यह आपको इन बयानों को संक्षेप में लिखने में मदद करता है। आप ऑपरेटरों की एक सीमित सीमा का उपयोग कर कोड लिख सकते हैं लेकिन आपका कोड एक पठनीयता दृष्टिकोण से चूस जाएगा और हर किसी का उपयोग करने वाले सम्मेलनों का पालन नहीं करेगा। – user2481095

5

यह एक शैली विकल्प है। यह कम से कम कोड के प्रदर्शन को प्रभावित नहीं करता है, यह सिर्फ पाठक के लिए इसे अधिक verbose बनाता है।

3

नहीं, मैं किसी भी लाभ नहीं दिख रहा है ("पठनीयता" उद्धरण में क्योंकि मैं == false नफरत और ! और अधिक पठनीय पाते हैं। लेकिन दूसरों को नहीं है।)। दूसरा एक और अधिक कठोर है।

बीटीडब्ल्यू: दूसरी शैली जेडीके स्रोत के हर कोने में पाई जाती है।

4

-1 विकल्प बहुत स्पष्ट है, लेकिन फिर 2 एक काफी सुरुचिपूर्ण है - यहाँ अपने कार्यक्षमता ....

होने से coding style के बारे में अधिक। .. कोई अपराध नहीं, यह सिर्फ मेरा विचार है ..

7

अधिकतर उत्तरदायित्व। अन्य कोड पढ़ते समय, के रूप में पढ़ने के लिए यह अधिक सहज ज्ञान युक्त हैपढ़ने के बजाय इसमें कुंजी है(values.containsKey(NoteColumns.CREATED_DATE) == false)

1

पहला फॉर्म, जब एपीआई के साथ उपयोग किया जाता है जो Boolean देता है और बूलियन.एफएएलएसई के मुकाबले तुलना करता है, तो कभी भी NullPointerException फेंक नहीं देगा।

दूसरा रूप है, जब java.util.Map इंटरफेस के साथ प्रयोग किया जाता है, भी एक NullPointerException क्योंकि यह एक boolean और नहीं एक Boolean रिटर्न फेंक कभी नहीं होगा।

यदि आप लगातार कोडिंग मुहावरे के बारे में चिंतित नहीं हैं, तो आप अपनी पसंद के एक को चुन सकते हैं, और इस ठोस मामले में यह वास्तव में कोई फर्क नहीं पड़ता। यदि आप लगातार कोडिंग के बारे में परवाह करते हैं, तो विचार करें कि आप Boolean की जांच करते समय क्या करना चाहते हैं जो NULL हो सकता है।

+1

यह वास्तव में प्रबुद्ध उत्तर हो सकता है, अगर मुझे केवल यह समझ में आया कि आप 'बूलियन' कहां देखते हैं। मैं देखता हूं कि एक 'बुलियन' है। कृपया समझाएँ। – ateiob

+0

"इस ठोस मामले में यह वास्तव में कोई फर्क नहीं पड़ता।" जैसा कि आप सही तरीके से इंगित करते हैं, ऊपर दिखाया गया कोई भी बूलियन नहीं है। मेरी चिंता भविष्य के कोड के लिए थी जो आपके लिए एक बूलियन प्रकार लौट सकती है और शायद शून्य हो सकती है। यदि आप मानते हैं कि यह "कभी नहीं होगा", तो यह उत्तर बहुत उपयोगी नहीं है। – Sam

2

नोट: ConcurrentMap के साथ आप अधिक कुशल

values.putIfAbsent(NoteColumns.CREATED_DATE, now); 

उपयोग कर सकते हैं मैं कम वर्बोज़ समाधान पसंद करते हैं और IsTrue या IsFalse या उनके जैसे तरीकों से बचें।

+0

उत्कृष्ट। मुझे यह पसंद है। चूंकि [ConcurrentMap] (http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html) [ContentValues] से प्राप्त नहीं हुआ है (http://developer.android.com/reference/android/ सामग्री/ContentValues.html) और दोनों के बीच सीधा संबंध नहीं है, क्या आपके पास पास किए गए 'ContentValues' पैरामीटर को 'ConcurrentMap' में कनवर्ट करने के लिए कोई सुझाव है? ओह रुको, 'ConcurrentMap' एक ** इंटरफ़ेस ** है! मुझे यह जांचने दो, मैं पहले कभी 'ConcurrentMap' पर नहीं आया था। – ateiob

+0

दिलचस्प, यह मानचित्र का विस्तार भी नहीं करता है और मुझे यकीन नहीं है कि इसका धागा सुरक्षित है। आप 'putIfAbsent (ContentValues, NoteColumns.CREATED_DATE, अब)' विधि लिख सकते हैं। ;) –

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