2013-08-05 10 views
5

यदि मैं एक वस्तु के लिए पूछता हूं कि एक पशु के लिए कहता है और लौटाया गया वस्तु शून्य नहीं है लेकिन इसमें शून्य चर शामिल हैं तो क्या गलत है? उदाहरण के लिए मैं animal.getDeathDate() पर कॉल कर सकता हूं; और चूंकि यह मृत नहीं है, फिर भी यह शून्य हो जाता है। एक कछुए के लिए शून्य वापस आ जाएगा क्योंकि यह तब तक उड़ने में असमर्थ है जब तक कि कछुए रॉकेट पैक नहीं जोड़ा जाता है। आदि,क्या जावा ऑब्जेक्ट में नल वैरिएबल एंटी-पैटर्न है? यदि ऐसा है तो कौन सा?

मैंने सोचा कि यह चीजों को करने का एक बुरा तरीका था क्योंकि ऑब्जेक्ट के तरीकों को कॉल करने के दौरान अक्सर बहुत कम शून्य की आवश्यकता होती है ताकि वे गैर-शून्य मान रख सकें। क्या इस बारे में जानकारी के कोई लिंक हैं जो मेरे और मेरे सहकर्मियों को आगे सूचित कर सकते हैं?

+1

आप शून्य ऑब्जेक्ट पैटर्न चाहते हैं। – SLaks

+0

मैंने नल ऑब्जेक्ट पैटर्न के बारे में पढ़ा लेकिन मुझे यकीन नहीं था कि क्या यह ऑब्जेक्ट्स को संबोधित करता है जिसमें शून्य चर होते हैं। मैंने सोचा कि यह डेटा ऑब्जेक्ट की बजाय क्वेरी विधि से शून्य या ऑब्जेक्ट को वापस किया जाना चाहिए या नहीं। – FooBar

+1

शून्य ऑब्जेक्ट पैटर्न मूल रूप से प्रत्येक 'शून्य' पर लागू होता है। गैर-शून्य मानों की गारंटी देना कोड को अधिक आसान बनाता है। – zapl

उत्तर

4

null अक्सर संदिग्ध होता है। क्या फ़ील्ड अभी तक शुरू नहीं हुआ था या इसका कोई मूल्य नहीं है?

अनिवार्य/अप्रासंगिक क्षेत्रों के लिए कुछ पूर्वनिर्धारित निरंतर होना बेहतर होता है।

यहां तक ​​कि बेहतर है कि एक वर्ग में केवल एक ही जिम्मेदारी हो। जैसे तरीके विरासत में नहीं आना चाहिए, बल्कि एक इंटरफ़ेस को लागू करने से आते हैं (getDeathDate() जैसे विधियां, हालांकि, Animal अभी भी जीवित है, तो एक पूर्वनिर्धारित निरंतर लौटा होना चाहिए)।

As brought by google-guava docs:

डौग Lea (java.util.concurrent पैकेज के लेखक) ने कहा कि Null s**ks

sir C. A. R. Hoare, null संदर्भ के आविष्कारक ने कहा: I call it my billion-dollar mistake

यह कुछ व्यापक कंधे पर रखना है।

+0

मेरी राय है, मैं कुछ संदर्भ सामग्री की उम्मीद कर रहा था हालांकि इसका समर्थन करने में मदद करने के लिए। Google के माध्यम से नल ऑब्जेक्ट पैटर्न के आस-पास एक बहुत बड़ी बहस से अधिक नहीं हो सका। – FooBar

+0

@FooBar ने कुछ संदर्भ जोड़ा। – yair

+0

'getDeathDate() 'वापस आने के लिए आप क्या प्रस्तावित करते हैं? – Gabe

1

नल कभी-कभी प्रतिनिधित्व करने का एक बिल्कुल सही तरीका हो सकता है कि किसी ऑब्जेक्ट में किसी विशेष संपत्ति की कमी होती है।

हालांकि, यह एकल चेक की अनुमति देने के लिए उपयोगी है।

किसी सरणी या सूची के लिए, यह एक चर है जो हमेशा गैर-शून्य है, लेकिन एक खाली सूची को इंगित कर सकता है। अन्यथा, यह जांचना आवश्यक हो जाता है कि वेरिएबल गैर-शून्य है और सूची में सदस्य हैं।

0

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

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

4

एक जीवित जानवर के लिए मौत की तारीख के लिए null रिटर्निंग पूरी तरह से उचित है, लेकिन इस तरह के मामलों में मैं एक बूलियन मौत की जांच की पेशकश करने के बेहतर लगता है:

public boolean isDead() { 
    return deathDate != null; 
} 

यह मौत की जाँच का एक उचित तरीका प्रदान करता है विशेषता के एक अनाड़ी अशक्त जांच के बिना एक उदाहरण के -नेस:

// this is ugly and exposes the choice of the value of the field when alive 
if (animal.getDeathDate() != null) { 
    // the animal is dead 
} 

जगह में isDead() विधि के साथ, आप अपने अधिकारों के भीतर किया जाएगा यह करने के लिए:

public Date getDeathDate() { 
    if (deathDate == null) 
     throw new IllegalStateException("Death has not occurred"); 
    return deathDate; 
} 

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

इसके बजाय, कुछ इस तरह का उपयोग करें:

interface Flyer { 
    Integer getFlightSpeed(); 
} 

class Animal {} 

class Turtle extends Animal {} 

class Eagle extends Animal implements Flyer { 
    public Integer getFlightSpeed() { 
     // 
    } 
} 
+0

getFlyingSpeed ​​मामले के लिए, एक इंटरफ़ेस को लागू करने के बजाय, क्या हमारे पास एनिमल क्लास में एक उदाहरण चर है जिसे फ्लायर प्रकार का संदर्भ दिया जा सकता है (इस इंटरफ़ेस में दो विधियां होंगी जैसे उड़ सकती हैं और उड़ान की गति मिल सकती हैं)? – Atul

+0

एक कैनफली() आवश्यक या वांछनीय नहीं है, क्योंकि ए) आप 'अगर (पशु इंस्टेसॉफ़ फ्लायर)' का उपयोग कर सकते हैं, और बी) फ्लाईर विधियों तक पहुंचने के लिए आपको फ्लायर को फेंकने की ज़रूरत है, इसलिए आप पहले ही जानते हैं कि यह एक फ्लायर है क्योंकि आपको डालने से पहले चेक का एक उदाहरण करना होगा। – Bohemian

0

अशक्त बिल्कुल ठीक हैं, लेकिन आप के बजाय वापस आ जाना चाहिए के रूप में संभव

के रूप में ज्यादा मूलभूत मूल्यों खाली सूची का उपयोग कर उदाहरण के लिए उनसे बचने की कोशिश करनी चाहिए अशक्त enum डेटा प्रकार के चाहिए अज्ञात शामिल

धारणा से ऊपर बना देता है एपीआई उपभोक्ता के जीवन आसान

आपके उदाहरण में मैं जानवर से हट जाऊंगा .getDeathDate क्योंकि मैं किसी भी उपयुक्त डिफ़ॉल्ट मान के बारे में सोच नहीं सकता।

मैं सुविधा विधि प्रदान करेगा लौटने सही/गलत

getFlightSpeed ​​के लिए() मैं अपने मामले के लिए 0 वापसी होगी

0

अशक्त वस्तु पैटर्न वास्तव में अशक्त चर के मामले में इस्तेमाल किया जा सकता animal.isDead। Turtle.getFlightSpeed ​​() के मामले में, आप स्पीड अवधारणा (इंटरफेस या अमूर्त वर्ग हो सकते हैं) को समझा सकते हैं, और एक नल ऑब्जेक्ट "परिदृश्य में असमर्थ" को लागू करने के लिए लागू कर सकते हैं। यह कछुए कक्षाओं में डिफ़ॉल्ट व्यवहार को निर्दिष्ट करने में मदद करेगा। पशु के मामले में वापसी शून्य .getDeathDate() ठीक लगता है

1

मुझे नहीं लगता कि यह गलत है। उपमा के तौर पर, NULL in SQL के शब्दों के बारे में सोच:

एक अच्छा तरीका क्या शून्य का मतलब है याद करने के लिए याद रखना होगा कि जानकारी के संदर्भ में, "एक मूल्य की कमी" नहीं एक ही बात के रूप में "एक मूल्य है शून्य "; इसी तरह, "उत्तर की कमी" एक जैसी बात नहीं है " कोई जवाब नहीं"।

यह जावा में एक ही तर्क लागू करने के लिए पूरी तरह से वैध है।

आदिम प्रकारों को नामुमकिन बनाने के लिए, nullable types in C# देखें। जावा जेनेरिक के रूप में Nullable लागू करना आसान होना चाहिए।

0

मुझे लगता है कि जानवर के लिए।GetDeathDate() जानवर जीवित है अगर शून्य वापस लौटना चीजों को करने का सही तरीका है। आपको 2 मामलों को संभालने के लिए हमेशा विशेष कोड की आवश्यकता होगी: जानवर जीवित, और पशु मर चुका है, और जानवर उपयोगी होने पर आप वापस लौटने की कोई उपयोगी तारीख नहीं है।

getFlightSpeed ​​() चीजों के लिए अलग हो सकता है। मुझे नहीं पता कि यह वास्तव में क्या लौटाता है लेकिन चलो बस एक उदाहरण के लिए कल्पना करें कि यह गति को वापस लौटाएं क्योंकि एम/एस

उस मामले में 0 (या एक ही प्रभाव वाला ऑब्जेक्ट) लौटने पर सही अर्थ होगा, क्योंकि यह उड़ान की गति का वर्णन करता है।

+0

"मुझे लगता है कि पशु के लिए .getDeathDate() जानवर जीवित है अगर शून्य काम कर रहा है, चीजों को करने का सही तरीका है।" ठीक है, अगर जानवर मर गया है, लेकिन कोई नहीं जानता कि कब? –

1

मेरे पास एक प्रमुख नल चेक नियम है जो किसी सूची या सरणी के बजाय शून्य नहीं होता है।

रिक्त सूचियां और सरणी वास्तव में व्यक्त करने के लिए बहुत बेहतर हैं।

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

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