2010-03-19 10 views
6

मैं पांच घंटे के लिए ग्रोवी का उपयोग कर रहा हूं और बस Groovy NullObject पर आया। मैंने ग्रोवी explanation of the Null Object Pattern पढ़ा, लेकिन यह सीधे NullObject वर्ग पर स्पर्श नहीं करता है; NullObject केवल NullTree और NullJob जैसी चीजों के लिए बेस क्लास बनने का इरादा है? मुझे NullObject कुछ कोड में वापस मिल रहा है जो String की अपेक्षा करता है, और यह "नियमित" null की तरह विफलता का कारण बनता है।ग्रोवी में नलऑब्जेक्ट क्लास का उद्देश्य क्या है?

तो, NullObject का उद्देश्य क्या है? या, अलग-अलग वाक्यांश, NullObject का मूल्य क्या है "नियमित" null नहीं करता है?

उत्तर

8

इसका उद्देश्य शून्य ऑब्जेक्ट है जिसके बजाय null कीवर्ड है।

सामान्य जावा null में एक विशेष कीवर्ड है कि इसका मतलब यह है कि संदर्भ किसी भी वस्तु से जुड़ी नहीं है .. यह ठीक काम करता है प्रयोग किया जाता है, लेकिन यह परिस्थितियों जिसमें आप एक अशक्त साथ कुछ करने की कोशिश से हैंडल नहीं करता संदर्भ।

चूंकि शून्य संदर्भ एक ऐसा ऑब्जेक्ट नहीं है जिसे आप कुछ भी नहीं कर सकते हैं और जावा NullPointerException फेंक देगा। विपरीत हाथ पर यदि आपके पास NullObject है तो आपका संदर्भ इसके बजाय किसी को भी इंगित नहीं करेगा .. निश्चित रूप से यह NullObject कुछ भी करने में सक्षम नहीं है, जब आप उस पर कोई विधि लागू करने का प्रयास करेंगे, तो कुछ भी नहीं होगा लेकिन कोई अपवाद नहीं होगा फेंक दिया जाएगा क्योंकि NullObject का अर्थ है "किसी भी वस्तु की अनुपस्थिति" इसे इन परिस्थितियों से बचने के लिए स्पष्ट रूप से एक वस्तु के रूप में लागू किया गया है।

ताकि ग्रोवी object?.methodName() जैसी चीजों को संभाल सके। यदि वस्तु रिक्त है ग्रूवी एक NullObject का उपयोग करेगा ताकि यह अंतर्निहित जाँच की तरह कुछ करना होगा

if (object instanceof NullObject) 
    return new NullObject(); 
else 
    return object.someMethod(); 

अंत में यह करने की जरूरत है (शायद यह वास्तविक क्रियान्वयन नहीं है, आप विचार देने के लिए बस है) इस तथ्य को दूर करें कि जावा में शून्य संदर्भ का उपयोग करने से हमेशा NullPointerException का कारण बन जाएगा।

+1

आप कहते हैं "जब आप इस पर एक विधि का आह्वान करने का प्रयास करेंगे तो कुछ नहीं होगा लेकिन कोई अपवाद नहीं फेंक दिया जाएगा"; एक मौलिक तार्किक त्रुटि एक NullPointerException से भी बदतर नहीं है? – Pops

+0

नहीं, यह चुप नहीं है क्योंकि आप केवल इस उद्देश्य के लिए __object? .method() __ वाक्यविन्यास का उपयोग करते हैं। सामान्य सिंटैक्स का उपयोग करना __object.method() __ वैसे भी एक नलपॉन्टर एक्सेप्शन फेंक देगा, नल पैटर्न के साथ भी .. – Jack

+0

एचएम, मुझे जावा और ग्रोवी के बीच अंतरों को और अधिक बारीकी से देखने की ज़रूरत है, मुझे लगता है। इस प्रश्न के लिए भविष्य के आगंतुकों के लिए संदर्भ: ऑपरेटर "?" सुरक्षित नेविगेशन ऑपरेटर नामित किया गया है। http://groovy.codehaus.org/Statements#Statements- Safenavigation – Pops

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