2010-04-26 11 views
23

एक सहकर्मी ने मुझे एक वर्गीकृत "बूलियन" का उपयोग करने के लिए एक आदिम "बूलियन" का उपयोग करने से हस्ताक्षर बदलने के लिए कहा। उसने एक बहुत अच्छा स्पष्टीकरण क्यों नहीं दिया?मुझे "बूलियन" के बजाय बूलियन को पैरामीटर के रूप में क्यों पास करना चाहिए?

क्या आप में से कोई इस बारे में सुना है और क्या आप में से कोई भी यह बता सकता है कि यह महत्वपूर्ण क्यों है या इससे कोई फर्क नहीं पड़ता?

संपादित करें: उन्होंने उल्लेख किया कि यह सार्वजनिक तरीकों के लिए अच्छा अभ्यास था।

फ़ील्ड का उपयोग सिर्फ एक झंडा है जो मुझे बताता है कि एक प्रवाह या दूसरे को कॉल करना है या नहीं, यह सच है या गलत है।

+0

देखें: http://stackoverflow.com/questions/1295170/whats-the-difference-between-boolean-and-boolean-in-java और यह भी देखें: http://stackoverflow.com/questions/2306257/boolean-instanceof-object-is-true – Shog9

+0

कोई सटीक डुप्ली नहीं है, ओपी दूसरे के ऊपर एक (डी) लाभ के लिए पूछता है, केवल अंतर नहीं। – kennytm

+0

@ शोग 9 - यह ऊपर सूचीबद्ध प्रश्न का डुप्लिकेट नहीं है। मैं बूलियन और बूलियन के बीच के अंतर के बारे में नहीं पूछ रहा हूं, मुझे अंतर पता है। मेरा सवाल यह है कि क्या कुछ डी-फैक्टो मानक है या कुछ जो मुझे नहीं पता है, यह बताता है कि आपको सार्वजनिक तरीकों के पैरामीटर प्रकारों के लिए "बूलियन" का उपयोग करना चाहिए। –

उत्तर

22

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

+1

क्या आपको 'बूलियन' का उपयोग करते समय मुक्केबाजी और अनबॉक्सिंग से निपटना पड़ेगा? –

+0

हाँ मुझे पता है, मुझे लगता है कि "बूलियन" ठीक है क्योंकि यह प्रवाह नियंत्रण के लिए सिर्फ एक ध्वज है। –

+0

@ एडम रॉबिन्सन - हाँ आप करेंगे (मेरा जवाब देखें) जो इस वरीयता को मेरे लिए और भी परेशान करता है। –

25

क्या यह डेटाबेस से संबंधित है? यदि आपके पास डेटाबेस में बूलियन मान है, तो यह तीन मानों में से एक को पकड़ सकता है - सत्य, गलत, और शून्य। बूलियन ऑब्जेक्ट आपको उस व्यवहार की नकल करने देगा।

असल में, यह एक मामला है कि आप एक संभावित इनपुट मान के रूप में "शून्य" से निपटना चाहते हैं या नहीं।

+0

+1 जब आपको गुप्त रूप से एक तीन-मूल्यवान चर मिल गया है, तो बूलियन निश्चित रूप से जाने का सही तरीका है। –

+6

@Jim: वास्तव में, जब आपको 3-मूल्यवान चर का प्रतिनिधित्व करने की आवश्यकता होती है, तो मैं तर्क दूंगा कि बूलियन बिल्कुल वही है जो आप उपयोग नहीं करना चाहते हैं। यह कम से कम आश्चर्य के सिद्धांत का उल्लंघन करता है - लोग उम्मीद करते हैं कि बुलियन के पास 2 राज्य होंगे। – rmeador

8

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

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

2

मैं आमतौर पर जहां भी संभव हो आदिम बुलीयन का उपयोग करने की कोशिश करता हूं।

एकमात्र संभावना है कि मैं डेवलपर के लिए सोच सकता हूं कि बूलियन क्लास मुक्केबाजी/अनबॉक्सिंग कर रहा है (लेकिन मुझे लगता है कि आप इसे हर जगह प्रोत्साहित करने के बजाय मुक्केबाजी/अनबॉक्सिंग को रोकना चाहते हैं) और शून्य की संभावना मान।

2

यदि आप इंटरफ़ेस के दोनों तरफ नियंत्रित करते हैं (यानी कॉलिंग कोड और कॉल की गई विधि) तो आपको बस सुसंगत होना चाहिए। यदि आप संकलक को आपके लिए वैरिएबल को ऑटोबॉक्स करने के लिए मजबूर करते हैं तो आप वास्तव में थोड़ा अधिक ओवरहेड लेते हैं।

तो सवाल में विधि समान हस्ताक्षरों के साथ तरीकों का एक सेट में से एक है, और सभी अन्य, स्थान जहां आपके boolean चला जाता है में किसी तरह की एक वस्तु पारित तो एक आदिम से एक वस्तु का इस्तेमाल करके उनकी बस एक बात हो सकती है थोड़ा और संगत होने का।

संपादित करें: पुनः पढ़ने, सवाल है कि boolean पैरामीटर वास्तव में सिर्फ है नियंत्रित करने के लिए एक if (जो वास्तव में है क्या आदिम के लिए नहीं है), तो वस्तु फ़ॉर्म का उपयोग करके बस CPU समय और स्मृति की बर्बादी है । मैं एक समझदार कारण के बारे में नहीं सोच सकता कि यह एक आदिम के बजाय एक वस्तु क्यों होनी चाहिए।

4

प्राचीन बूलियन पर बूलियन का मुख्य लाभ यह है कि वे आपको शून्य मूल्य प्राप्त करने की अनुमति देते हैं। यह वापसी मूल्यों के लिए विशेष रूप से प्रभावी है लेकिन कभी-कभी जावा में "वैकल्पिक" तर्क के लिए उपयोग किया जा सकता है।

मेक सुनिश्चित करें कि आपके Javadocs (और कोड) अशक्त

2
कभी

किसी भी वैध कारण के बारे में सुना से निपटने के boolean से अधिक Boolean पसंद कर सकते हैं।

एक मौका दिया, हमेशा primitives के साथ रहना। बूलियन चर null हो सकता है; और इस प्रकार आपकी विधि में एक अप्रत्याशित व्यवहार पेश कर सकते हैं। आपके सह-कार्यकर्ता के पास प्रोग्राम कार्यान्वयन/तर्क के आधार पर कुछ विशिष्ट कारण हो सकते हैं।

0

आप बूलियन उपयोग करते हैं, तो आप या तो एक बूलियन या एक बूलियन विधि

public void setX(boolean b) //only takes boolean 

public void setX(Boolean b) //takes Boolean or boolean 

को पारित कर सकते हैं इस समारोह में बूलियन्स की autoboxing के कारण है।

संपादित: autoboxing केवल 1.5+

+0

अच्छा बिंदु, लेकिन 1.4 में नहीं –

1

में काम करता है यह सरल रखें। का उपयोग करते हुए बूलियन:

  • जटिलता के एक अतिरिक्त परत जोड़ता
  • एक सही/गलत राज्य बूलियन लेता है और अगर एक तर्क ध्वज के रूप में इस्तेमाल एक सही/गलत/बातिल राज्य चर
  • कोई लाभ प्रदान करता है में बदल देता है (के रूप में) BlairHippo ने उल्लेख किया
  • संभावित जावा 1,4
0

में कोड की अतिरिक्त लाइनें बॉक्स/Unbox बूलियन्स की आवश्यकता है आप अपने एप्लिकेशन में डेटा-बाइंडिंग ढांचा किसी भी तरह का उपयोग कर रहे हैं वहाँ कोई डाटाबेस संपर्क संभालने रहा है? मुझे हाल ही में एक ऐसे मामले से निपटना पड़ा जहां boolean एक मॉडल ऑब्जेक्ट में एक फॉर्म के लिए बाध्य होना आवश्यक था। फॉर्म में फ़ील्ड आवश्यक था, लेकिन हम मान को true या false पर डिफ़ॉल्ट रूप से डिफ़ॉल्ट नहीं करना चाहते थे (क्योंकि उपयोगकर्ता के लिए विशिष्ट मामला के लिए सही मान चुनना महत्वपूर्ण था, यदि कोई डिफ़ॉल्ट था, तो आप आसानी से बहुत सारे गलत मान प्राप्त करें।) हालांकि, ऑब्जेक्ट को सत्यापित करने से पहले, फ़ॉर्म के मानों को इसके साथ बाध्य होना था। बेशक, यदि उपयोगकर्ता ने कोई मूल्य नहीं चुना है, तो यह null को फ़ील्ड में बांधने का प्रयास करेगा, और बाध्य के दौरान एक अपवाद फेंक दिया जाएगा। इसलिए हमने इसे Boolean में बदल दिया ताकि null अस्थायी रूप से फ़ील्ड से बाध्य हो सके, और फिर सत्यापन रिपोर्ट कर सकता था कि फ़ील्ड आवश्यक था।

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