2009-09-09 17 views
29

क्या जेडीके में कोई विधि है जो समानता के लिए दो ऑब्जेक्ट्स की तुलना करती है, नल के लिए लेखांकन? कुछ इस तरह:शून्य के लिए दो ऑब्जेक्ट्स की तुलना करें

public static boolean equals(Object o1, Object o2) 
{ 
    if (o1 == null) 
    { 
     return o2 == null; // Two nulls are considered equal 
    } 
    else if (o2 == null) 
    { 
     return false; 
    } 

    return o1.equals(o2); 
} 

यह इस विधि अपने आप को लिखने के लिए के बाद से मैं इसे कहीं पहले से ही मौजूद नहीं है लगता होगा मूर्खतापूर्ण लगता है।

उत्तर

51

जावा 7.0 एक नया काम वर्ग कहा: Objects

यह इस के लिए वास्तव में एक विधि है: Objects.equals(Object a, Object b)

+0

अच्छा, ध्यान रखें कि जावा 7 अभी तक सार्वभौमिक रूप से उपलब्ध नहीं है। मैं आम तौर पर एक एपीआई का उपयोग न करने का प्रयास करता हूं जब तक कि इसकी तैनाती कम से कम 95% –

+1

@ एडवर्डफॉक हां तक ​​पहुंच गई न हो, और यह भी ध्यान रखें कि जावा 7 (या कोई अन्य संस्करण) कभी 100% उपलब्धता तक नहीं पहुंच पाएगा। आज यह 12 जुलाई, 2015 है, जावा 7 बिल्कुल 4 साल पुराना है, जावा 6 ** 9 साल पुराना है **। यहां तक ​​कि जावा 7 भी ** जीवन के अंत तक पहुंच गया ** जिसका अर्थ है कि जावा 7 के लिए भी कोई सार्वजनिक अपडेट नहीं होगा। आप केवल जावा 6.0 एपीआई का उपयोग करके प्रोत्साहित क्यों करेंगे? हां, ऐसे कंप्यूटर हैं जिनमें केवल जावा 6.0 है, लेकिन व्यक्तिगत रूप से मैं जावा 7 और 8. – icza

+0

में जोड़े गए सुविधाओं को छोड़ने के खर्च पर, एक दशक पुरानी प्रणाली के लिए सॉफ़्टवेयर विकसित नहीं करना चाहता हूं, हाँ, यह मेरी कामकाजी शैली है । मैंने पिछले कुछ वर्षों में केवल जावा 6 फीचर्स का उपयोग शुरू किया है, और अभी तक जावा 7 या 8 फीचर्स का उपयोग नहीं किया है। मैं अपने पूरे जीवन में ऐसा ही रहा हूं; मैंने Ansi सी का उपयोग शुरू नहीं किया जब तक कि के एंड आर सी कहीं भी उपलब्ध नहीं था। जब मुझे उनकी ज़रूरत होती है तो मैं नई सुविधाओं का उपयोग करूंगा, लेकिन जब भी संभव हो, मैं पसंद करता हूं कि मेरा कोड संकलित और हर जगह चलाएं। –

4

आप NullPointerExceptions के बारे में चिंतित तुम सिर्फ तरह समानता का परीक्षण कर सकते हैं:

if (obj1 != null && obj1.equals(obj2)) { ... } 

equals() के सामान्य अनुबंध है कि एक गैर-शून्य वस्तु कभी नहीं एक अशक्त संदर्भ के बराबर होना चाहिए, और है कि equals() विधि यदि आप ऑब्जेक्ट को किसी नल संदर्भ (और एनपीई फेंक नहीं देते) की तुलना कर रहे हैं तो झूठी वापसी करनी चाहिए।

+2

मैं का उपयोग करें कि अन्य स्थितियों में तर्क, लेकिन यहाँ मैं विशेष रूप से दो nulls (सच खंड निष्पादित करने के लिए और इस तरह) बराबर पर विचार किया जा करना चाहते हैं। यह इनलाइन करने के लिए सुंदर वर्बोज़ होगा: अगर ((obj1 == null && obj2 == null) || (obj1! = Null && obj1.equals (obj2))) {...} – dcstraw

+1

यह उन में से एक है संरचनाएं (जैसे IOException की देखभाल किए बिना शून्य और खाली या स्ट्रीम को बंद करने के लिए स्ट्रिंग की जांच करना) जो आंखों पर कठिन है और जिसके लिए कॉमन्स-लैंग का समाधान है। – SingleShot

+0

मैं सिंगलशॉट से सहमत हूं और मैं इस तरह की चीजों के लिए अक्सर कॉमन्स-लैंग का उपयोग करता हूं। –

17

अपाचे कॉमन्स लैंग की ऐसी विधि है: ObjectUtils.equals(object1, object2)। आप जेनरिक्स को ऐसी विधि पर नहीं चाहते हैं, इससे कम से कम सामान्य उपयोग में फर्जी संकलन त्रुटियों का कारण बन जाएगा। ऑब्जेक्ट की कक्षा की जांच करने और झूठी वापसी के लिए बराबर अच्छी तरह से जानता है (या चाहिए - यह अनुबंध का हिस्सा है), इसलिए इसे किसी भी अतिरिक्त प्रकार की सुरक्षा की आवश्यकता नहीं है।

+0

हां, मुझे लगता है कि जेनेरिक वास्तव में आपको इस मामले में कुछ भी नहीं खरीदते हैं। आप अभी भी पूरी तरह से अलग प्रकार में गुजर सकते हैं और टाइप अनुमान केवल ऑब्जेक्ट को टाइप पैरामीटर के रूप में चुन देगा। मुझे यकीन नहीं है कि "बोगस संकलन त्रुटियों" का क्या आप उल्लेख कर रहे हैं। – dcstraw

+0

मैंने निश्चित रूप से जेनेरिक करने के प्रयासों को देखा है जैसे कि समस्याएं हैं (जेनेरिक पैरामीटर के साथ, और इसी तरह)। मैं इस परिदृश्य में इसे जल्दी से पुन: पेश नहीं कर सका, इसलिए आप सही हो सकते हैं, लेकिन यदि ऐसा है, तो जेनेरिक व्यर्थ हैं, क्योंकि वे कुछ भी स्वीकार करेंगे, तो ऑब्जेक्ट की घोषणा क्यों न करें? – Yishai

+1

सहमत हुए। इस मामले में ऑब्जेक्ट का उपयोग करना बेहतर है। – dcstraw

2

जब भी मुझे आवश्यकता होती है और सोचती है "यह इतना आम है कि जावा में यह होना चाहिए" लेकिन यह नहीं लगता कि मैं जकार्ता कॉमन्स प्रोजेक्ट की जांच करता हूं। यह लगभग हमेशा है। कॉमन्स-लैंग एपीआई (जिसमें सामान्य उपयोगिताएं सबसे बुनियादी हैं) की एक त्वरित खोज equals() विधि दिखाती है जो आप जो चाहते हैं उसे प्रदान करती है।

14

FWIW क्या देख रहे, यह मेरी कार्यान्वयन था:

private static boolean equals(Object a, Object b) { 
    return a == b || (a != null && a.equals(b)); 
} 

अपने आवेदन में, मुझे पता है कि ए और बी हमेशा एक ही प्रकार के हो जाएगा, लेकिन मैं संदेह है कि यह ठीक काम करता है भले ही वे नहीं हैं, बशर्ते कि एक .equals() उचित रूप से कार्यान्वित किया गया हो।

+2

नया तरीका 'ऑब्जेक्ट्सequequals (ऑब्जेक्ट ए, ऑब्जेक्ट बी) ' – tmin

+1

नया 1.7 में है। अच्छा लगा। –

+0

'वापसी (एक == शून्य)? (ए == बी): a.equals (बी); 'आपके पास जो कुछ है उसके मुकाबले बहुत अधिक पठनीय लगता है (भले ही यह एक ही ऑब्जेक्ट के बराबर कॉल करता हो)। – Dukeling

5
public static boolean equals(Object object1, Object object2) { 
    if (object1 == null || object2 == null) { 
     return object1 == object2; 
    } 
    return object1.equals(object2); 
} 
संबंधित मुद्दे