2011-10-25 12 views
15

मैं equals तरीकों में इस बल्कि कष्टप्रद और बदसूरत की तरह चीज़ों को ढूंढने:अशक्त जांच को रोकने के लिए पहले के बराबर होती है

if (field == null) 
{ 
    if (other.field != null) 
     return false; 
} 
else if (! field.equals(other.field)) 
    return false; 

सी # में मैं ऐसा करने के बाद कर सकते हैं:

if(! Object.Equals(field, other.field)) 
    return false; 

वहाँ कुछ इसी तरह है जावा में, या चीज़ अगर ऐसा करने का पसंदीदा तरीका क्या है?

+1

मुझे लगता है कि आपको यह धागा उपयोगी लगेगा: http://stackoverflow.com/questions/271526/how-to-avoid-null-statements-in-java – hovanessyan

+0

दिलचस्प, सुनिश्चित करें। उपयोगी ... व्यक्तिगत रूप से यह अधिकतर उठाए गए प्रश्न: पी – Svish

उत्तर

23

उपयोग कॉमन्स-लैंग:

org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2) 

स्रोत कोड:

public static boolean equals(Object object1, Object object2) { 
    if (object1 == object2) { 
     return true; 
    } 
    if ((object1 == null) || (object2 == null)) { 
     return false; 
    } 
    return object1.equals(object2); 
} 

अपाचे

http://commons.apache.org/lang/

क्या आप में क्या सी #

+0

और यदि आप उस विधि को स्थिर रूप से आयात करते हैं (स्थिर statg orap.apache.commons.lang.ObjectUtils.equals;) तो आप बस 'बराबर (ए, बी) लिख सकते हैं 'आपके कोड में –

+0

बहुत बढ़िया। उस वर्ग के बारे में नहीं पता था! 'ObjectUtils.hashCode' भी शानदार था। – Svish

+2

@ ओस्करलोपेज़: आप ऐसा नहीं कर सकते। कंपाइलर इसे पसंद नहीं करेगा ('ऑब्जेक्ट.क्वल्स (ऑब्जेक्ट)' के साथ टकराव की वजह से)। यही वह जगह है जहां अमरूद की 'बराबर() 'विधि बेहतर है –

0

String.valueOf() आपकी कक्षाओं के लिए ToString लागू होने पर उन समस्याओं में से कुछ को हल करेगा। पॉइंटर शून्य होने पर यह toString() उत्तर या "शून्य" थूक जाएगा।

+0

यह निर्भर करता है कि क्या आप 'शून्य' के फ़ील्ड मान को "शून्य" के बराबर बराबर मानना ​​चाहते हैं। मैं ज्यादातर मामलों में कहूंगा कि * वांछनीय नहीं है। यह आपके टूस्टिंग मिलान पर भी निर्भर करता है जो समानता मिलान के लिए आवश्यक है ... और यह धीमा होने की भी संभावना है ... –

+0

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

+0

मैं 'null == null' के बारे में बात नहीं कर रहा हूं। मैं 'शून्य ==" शून्य "के बारे में बात कर रहा हूं। –

4
के बारे में बराबर है कि से

मैं इसे इस तरह से लिखना होगा:

return field != null && other.field != null && field.equals(other.field); 

जो सी # कोड पंक्ति के रूप में के रूप में सुंदर है, लेकिन बहुत कम तो पेड़ अगर आप पोस्ट नहीं है।

+0

हाँ, अगर यह केवल एक फ़ील्ड था जो समाधान हो सकता है। समस्या तब होती है जब ऑब्जेक्ट में जांच करने के लिए कई फ़ील्ड होते हैं। – Svish

+0

लेकिन अगर परिणाम सच है तो क्या होगा अगर समारोह कुछ बाद में करता है? –

+1

लेकिन यह गलत है, दोनों क्षेत्रों के बारे में क्या शून्य है? – maaartinus

6

Guava equal जो करता है यह:

public static boolean equal(@Nullable Object a, @Nullable Object b) { 
    return a == b || (a != null && a.equals(b)); 
    } 

या null object pattern

अमरूद भी कुछ हद तक संबंधित comparison chain और एक अन्य goodies का भार है।

+1

विधि 'बराबर' और 'बराबर' (कॉमन्स-लैंग की तरह) को कॉल करने के बारे में अच्छी बात यह तथ्य है कि इसका उपयोग स्थिर आयात में किया जा सकता है ... –

1

प्रोजेक्ट सिक्का के हिस्से के रूप में, जावा पर null-safe operators की एक श्रृंखला जोड़ने का प्रस्ताव था। अफसोस की बात है, उन्होंने इसे जावा 7 में नहीं बनाया है, शायद वे जावा 8 में दिखाई देंगे। Here यह सामान्य विचार है कि वे कैसे काम करेंगे

36

जावा 7 java.util.Objects.equals प्रदान करता है।

+4

यह ऐसा करने के लिए "नया" अनुशंसित तरीका है। @ स्विस, यदि आप भविष्य के दर्शकों के लिए स्वीकृत उत्तर बदल सकते हैं ... :) –

+3

नोट: एंड्रॉइड के लिए, इस विधि को 'न्यूनतम API'> = 19. – ToolmakerSteve

+1

हां की आवश्यकता है, यह विधि 'NullPointerException' से बचने में मदद करती है। ध्यान दें कि 'ऑब्जेक्ट.क्वल्स (शून्य, शून्य)' सत्य लौटाता है। – kiedysktos

2

मैं तकनीकी रूप से सभी उत्तरों को स्वीकार करता हूं। व्यावहारिक रूप से मैं उन कोडों में से किसी का भी उपयोग नहीं करूँगा जो मेरे नियंत्रण में हैं क्योंकि सभी प्रदत्त समाधान मुख्य समस्या के आसपास काम कर रहे हैं: शून्य-मान। अपने कोर मॉडल को नल मूल्यों से मुक्त रखें, और इस मामले में प्रश्न अप्रचलित है।

सिस्टम सीमाओं जैसे तृतीय पक्ष पुस्तकालयों को कभी-कभी शून्य मानों से निपटना पड़ता है। उन्हें कोर मॉडल के लिए सार्थक मूल्यों में परिवर्तित करना चाहिए। वहां दिए गए समाधान उपयोगी हैं।

भले ही ओरेकल बराबर-सुरक्षित होने के तरीकों की सिफारिश करता है, इसके बारे में सोचें: एक बार जब आप अपने मॉडल को शून्य मान स्वीकार करते हैं तो यह नाजुक हो रहा है। बराबर विधि अंतिम विधि नहीं होगी जहां आप शून्य की जांच करेंगे। आपको अपने विधि कॉल पदानुक्रम में नल-चेक प्रबंधित करना होगा। विधियों को अब बॉक्स से बाहर नहीं किया जा सकता है। जल्द ही, प्रत्येक पैरामीटर को शून्य के लिए चेक किया जाएगा।

मैं दोनों पक्षों देखा:

एक तरफ अशक्त चेक, तरीकों कि एक एकल पैरामीटर अब और नहीं पर भरोसा और डेवलपर्स कि एक अशक्त जांच भूल डरते हैं से भरा कोड पर।

दूसरी तरफ पूर्ण अभिव्यक्तिपूर्ण बयान वाले कोड जो पूर्ण कार्य करने वाली वस्तुओं के स्पष्ट निष्कर्ष निकालते हैं जिनका उपयोग NullPointerExceptions के डर के बिना किया जा सकता है।

0

जब आप ऑब्जेक्ट संदर्भों की जांच कर रहे हैं तो == ऑपरेटर का उपयोग करें, यदि दोनों संदर्भ एक ही वस्तु को संदर्भित करते हैं तो यह सच हो जाएगा। अन्यथा यदि आप ऑब्जेक्ट सामग्री की तलाश में हैं तो वस्तुओं के .equals विधि के साथ जाएं।

तो शून्य का मतलब है कि इसमें ढेर में कोई स्मृति स्थान नहीं है। तो इसे आसानी से '==' ऑपरेटर के साथ चेक किया जा सकता है।

1

असल में हर कोई ऐसा करने का अपना तरीका अनुसरण करता है और मैं यहां भी ग्रोवी पेश करना चाहता हूं।

एक ही रास्ता

field == null ? false : true; // तो मूल रूप से यह सच वापस आ जाएगी जब यह रिक्त नहीं है नहीं है।

ग्रोवी में वस्तुओं के लिए शून्य सुरक्षित ऑपरेटर है। चलो वर्ग

A { 
String name = "test1" 
String surName = "test2" 

public String returnName() { 

return name + surName 
} 

} 

A a = null a?.name // उल्लेख ऑपरेटर के लिए एक उदाहरण लेते ? वास्तव में जाँच करेगा कि क्या एक null है या नहीं। तो यह नाम का आह्वान करेगा।

नोट: मैंने कोड में अर्ध कोलन लागू नहीं किया क्योंकि यह ग्रोवी में आवश्यक नहीं है।

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