2013-04-16 4 views
5

क्यों कोई Objects.equal प्रत्येक प्राचीन प्रकार के तर्क के रूप में प्राप्त नहीं किया जा रहा है?क्यों प्राचीन वस्तुओं के लिए guava Objects.equal (ऑब्जेक्ट, ऑब्जेक्ट) नहीं है?

मुझे पता है कि आप #valueOf के माध्यम से मूल्य को बॉक्स कर सकते हैं या प्रत्येक आदिम को ऑटोबॉक्ड किया जा सकता है, लेकिन क्या आप ऐसा प्रदर्शन खोना नहीं चाहते? यह कुछ ऐसा है जो मैं कुछ समय के लिए सोच रहा था।

कल्पना कीजिए मैं की तरह

public class Foo { 
    private final int integerValue; 
    private final boolean booleanValue; 
    private final Bar bar; 

    public Foo(int integerValue, boolean booleanValue, Bar bar) { 
     this.integerValue = integerValue; 
     this.booleanValue = booleanValue; 
     this.bar = bar; 
    } 

    @SuppressWarnings("boxing") 
    @Override 
    public boolean equals(Object object) { 
     if (object instanceof Foo) { 
      Foo that = (Foo) object; 

      return Objects.equal(this.integerValue, that.integerValue) 
        && Objects.equal(this.booleanValue, that.booleanValue) 
        && Objects.equal(this.bar, that.bar); 
     } 
     return false; 
    } 

    // hashCode implementation using guava also. 
} 

इस equals लागू करने के लिए सबसे अच्छा तरीका है कुछ है? आदिम मूल्यों को ऑटोबॉक्साइड किया जा रहा है, पीड़ित (यहां तक ​​कि अगर यह थोड़ा है) एक प्रदर्शन गिरावट। मैं सिर्फ उनके लिए == का उपयोग कर सकता था, लेकिन मेरे लिए यह बराबर विधि को पढ़ने के "प्रवाह" को तोड़ देगा, इसे थोड़ा बदसूरत बना देगा। तो मुझे आश्चर्य है कि क्यों प्रत्येक अतिथि प्रकार के लिए guava lib के पास Objects.equal नहीं है। क्या किसी को जवाब पता है?

संपादित

प्रत्येक आदिम (लेकिन बाइट) के लिए MoreObjects.toStringHelper अधिभार के लिए है, कि एक कारण मैंने सोचा के बारे में Objects#equal के लिए होने नहीं है। इसके अलावा, JB Nizet तर्क का उपयोग करके, यह equals विधि को सुरक्षित करेगा क्योंकि आप Integer के लिए समान शुद्धता के बारे में चिंता किए बिना बदल सकते हैं।

Guava docs

+0

आपके संपादन के बारे में - ऐसा लगता है कि 'ToStringHelper'' ऑब्जेक्ट्स 'का सदस्य है क्योंकि सभी' ऑब्जेक्ट 'उदाहरणों में' toString() 'सामान्य है। तथ्य यह है कि सहायक स्वयं 'int' तर्क लेता है, इत्यादि केवल इसलिए होता है क्योंकि 'ऑब्जेक्ट' में 'int' हो सकता है ('toString() 'परिणाम में शामिल किया जा सकता है)। उम्मीद है कि समझ में आता है। –

+0

लेकिन यदि ऐसा इसलिए है क्योंकि आपके पास 'int' फ़ील्ड हो सकता है, तो यह' ऑब्जेक्ट्स # बराबर 'के लिए लागू होता है। हालांकि 'ऑब्जेक्ट्स # बराबर' से अलग, जिसे '==' द्वारा प्रतिस्थापित किया जा सकता है, ऑटोबॉक्सिंग से बचने के लिए आप 'स्ट्रिंगहेल्पर # एड' में कुछ भी नहीं उपयोग कर सकते हैं। इस प्रकार, आदिम तरीकों। या कम से कम यही मुझे लगता है: पी –

उत्तर

6

मैं सिर्फ उनके लिए == इस्तेमाल कर सकते हैं, लेकिन मेरे लिए यह बराबरी विधि पढ़ने, यह एक छोटे बदसूरत मोड़ के "प्रवाह" टूट जाएगा। हर विधि एक API को उजागर करता है कि, प्रलेखित किया जाना परीक्षण किया है, और बनाए रखा है -

यह अमरूद एपीआई के लिए प्रत्येक आदिम प्रकार के लिए है कि विधि की एक अधिभार जोड़ने के लिए एक ठोस पर्याप्त कारण नहीं है। यह समझ में नहीं आता है जब एकमात्र लाभ सौंदर्यशास्त्र है।

+2

+1, हालांकि मैं कहूंगा कि यह "दृढ़ * पर्याप्त * कारण नहीं है।" –

+0

मुझे बिंदु दिखाई देता है, लेकिन हम अक्सर कोड को और अधिक पठनीय बनाने के लिए सामान करते हैं। ऐसा नहीं है कि यह मामला है, लेकिन मुझे नहीं पता कि यह अधिभारित तरीकों को बनाए रखना कितना मुश्किल होगा (आलोचक नहीं, मैं वास्तव में परीक्षण और दस्तावेज़ीकरण के अलावा पता नहीं)। –

+5

लागत में प्रत्येक उपयोगकर्ता के लिए 'ऑब्जेक्ट्स' कक्षा के जावाडोक में अतिरिक्त अव्यवस्था शामिल है जो कुछ भी खोजने के लिए वहां से चल रहा है, साथ ही, काफी सीमित (और बहस योग्य) लाभ के लिए। इसके अतिरिक्त, मुझे यह स्वीकार करना होगा कि 'ऑब्जेक्ट्स' नामक कक्षा में आदिम प्रकारों के लिए विशेष 'बराबर' हैंडलिंग होने के लिए मुझे यह सचमुच odd_ मिल जाएगा। –

2

मुझे पता है कि आप #valueOf के माध्यम से मूल्य को बॉक्स कर सकते हैं या प्रत्येक आदिम को ऑटोबॉक्साइड कर सकते हैं, लेकिन क्या आप ऐसा प्रदर्शन खोना नहीं चाहते?

यह सच है, लेकिन प्रदर्शन के प्रति संवेदनशील कोड के लिए, आप निश्चित रूप से वैसे भी == उपयोग करने के लिए एक विधि लागू करने के बजाय एक सरल if_icmpeq opcode प्राप्त करना चाहते हैं। तो यदि आप Objects.equal का उपयोग कर रहे हैं, तो शायद आप प्रदर्शन-संवेदनशील कोड नहीं लिख रहे हैं, और शायद ऑटोबॉक्सिंग की लागत पर ध्यान नहीं दिया जाएगा।

मैं यह नहीं कह रहा हूं कि Objects.equal का एक आदिम संस्करण शून्य लाभ होगा, लेकिन शायद पुस्तकालय में कई विधियों को जोड़ने के लायक नहीं है।

+0

अच्छी तरह से डाल दिया। उत्तर के लिए धन्यवाद: डी –

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

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