2013-07-22 3 views
29

कुछ दिन पहले हमने अपनी कंपनी के भीतर जावा 7 पर स्विच किया - अंततः! जे \ o/तो मैं बाहर Objects कक्षा के बारे में मिल गया और चकित कैसे कम तरीकों hashCode()equals() और महसूस किया गया, डिफ़ॉल्ट प्रति ग्रहण (ALT + SHIFT + एस द्वारा उत्पन्न की तुलना में boylerplate कोड का एक बहुत कुछ को कम करने था -> एच)।jdk 7 ऑब्जेक्ट्स क्लास से कॉम्पैक्ट बराबर() और हैशकोड() उत्पन्न करने के लिए ग्रहण कैसे सिखाया जाए?

मैं सोच रहा था कि क्या मैं hashCode() और equals() उत्पन्न ग्रहण के डिफ़ॉल्ट व्यवहार को बदल सकता हूं?

मैं यह देखने में खुशी होगी:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 
बजाय इस बात का

:

@Override 
public int hashCode() 
{ 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((one == null) ? 0 : one.hashCode()); 
    result = prime * result + ((two == null) ? 0 : two.hashCode()); 
    result = prime * result + ((three == null) ? 0 : three.hashCode()); 
    result = prime * result + ((four== null) ? 0 : four.hashCode()); 
    // ... 
    return result; 
} 

ही equals() के लिए चला जाता है। This is the article मुझे यह मिला।

कोई भी विचार कैसे यह सबसे अच्छा महसूस करने के लिए?

+0

के लिए "toString उत्पन्न()" यह wizzard के पृष्ठ पर एक टेम्पलेट परिभाषित करना संभव है। आपको [eclipse-bugzilla] (https://bugs.eclipse.org/bugs/) पर टिकट दर्ज करना चाहिए, शायद वे भविष्य में eq + हैशकोड के लिए कुछ समान जोड़ सकते हैं। यदि आप ऐसा करते हैं तो कृपया टिकट की तरह, इसलिए रुचि रखने वाले सभी लोग इसे ऊपर उठा सकते हैं! – Chriss

+0

यदि आप इसे देखना नहीं चाहते हैं तो आप 'हैशकोड()' फ़ंक्शन को भी फोल्ड कर सकते हैं। मुझे लगता है कि भविष्य में सभी संभावित मामलों में डिफ़ॉल्ट कार्यान्वयन क्या है या नहीं, यह विचार करना एक अच्छा विचार हो सकता है। शॉर्टंड अभिव्यक्ति को डिफॉल्ट करके आप 'हैशकोड' (कोर्स के अपरिवर्तनीय नहीं) को ट्विक करने में अपनी लचीलापन से गुज़रेंगे, क्या आपको ऐसा करना/चाहिए। हैश फ़ंक्शंस पर चर्चा के लिए http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overriding-hashcode देखें। – posdef

+0

मैंने इस वृद्धि को लॉग किया है। इसके लिए वोट दें! https://bugs.eclipse.org/bugs/show_bug.cgi?id=424214 –

उत्तर

4

ग्रहण वरीयताओं में जावा> संपादक> टेम्पलेट में जाते हैं।

वहाँ में आप एक नया टेम्पलेट बना सकते हैं। पैटर्न इस तरह दिख सकता है:

@Override 
public int hashCode() 
{ 
    return Objects.hash(one, two, three, four/*, ...*/); 
} 

मुझे यकीन नहीं है कि कोई चर है जो आपके फ़ील्ड को सही ढंग से समझाएगा।

आप some further explanations on these templates

+7

दुर्भाग्य से टेम्पलेट प्रणाली क्षेत्रों की गणना का समर्थन नहीं करता (कुछ ** $ {enclosing_method_arguments} **, यह हो सकता है के लिए इसी तरह _ $ {enclosing_type_fields} _ अगर यह अस्तित्व में था)। भले ही आप बॉयलरप्लेट को स्वचालित रूप से उत्पन्न करने के लिए टेम्पलेट लिखते हैं, फिर भी आपको 'हैश()' विधि के अंदर फ़ील्ड नामों को मैन्युअल रूप से भरना होगा।और मुझे नहीं पता कि हैशकोड और बराबर टेम्पलेट _Java> कोड स्टाइल> कोड टेम्पलेट्स _... – ADTC

2

को देखने के लिए चाहते हो सकता है वहाँ जावा 7 सुविधाओं, अपाचे आम लैंग पुस्तकालय, अमरूद लाइब्रेरी का उपयोग कर toString(), hashCode(), के बराबर होती है() पद्धतियों उत्पन्न कर सकते हैं जो एक नया प्लगइन उपलब्ध है। इसमें अच्छी अनुकूलन योग्य विशेषताएं हैं। प्लगइन स्थापित करने के लिए कृपया नीचे दिए गए लिंक को ढूंढें। स्थापना के बाद, सिर्फ सही क्लिक -> Jenerate -> विभिन्न विकल्पों

लिंक - https://marketplace.eclipse.org/content/jenerate

+0

में सूचीबद्ध नहीं है दुर्भाग्यवश, इस प्लगइन में एक बग है, यह हैशकोड उत्पन्न नहीं करता है और यदि आपके पास सुपर क्लास है तो सही तरीके से बराबर होती है। –

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