2011-08-05 20 views
15

सरल डेटा के लिए equals() और hashCode() लागू करने के लिए पीओजेओ मेरे कोड को अव्यवस्थित कर रहा है और बनाए रखना कठिन है।जावा: स्वचालित बराबर() और हैशकोड()

लाइब्रेरी स्वचालित रूप से इसे कैसे प्रबंधित कर रहे हैं?
मैं प्रदर्शन कारणों से एओपी दृष्टिकोण पर बाइटकोड वाद्ययंत्र पसंद करता हूं।

अद्यतन:) बराबरी को लागू करने की आवश्यकता है (और hashCode() पर चर्चा की गई है की विषय, यहाँ मेरी बात है:

नहीं यह बेहतर यह कम से कम के बजाय प्रयास में खुदाई के साथ अग्रिम सही किया है है कोड, एचसी/ईक जोड़ने जब यह आता है?

+4

कोई लाइब्रेरी आपके लिए 'बराबर' का ख्याल रख सकती है - केवल आप जानते हैं कि दो ऑब्जेक्ट्स बराबर क्या बनाता है। आप किस आईडीई का उपयोग कर रहे हैं जो आपके लिए 'हैशकोड' उत्पन्न नहीं करता है? और आपको 'बराबर' और 'हैशकोड' पर इतना रखरखाव क्यों करना है? – Paul

+1

मैं समझता हूं कि जावा समुदाय में मूल रूप से प्रत्येक POJO के लिए इन तरीकों को लागू करना आम है, लेकिन मुझे यह पूछना है: क्या आप वास्तव में अपने सभी POJO प्रकारों का उपयोग हैश टेबल में कुंजी के रूप में कर रहे हैं? क्या आप उन्हें समानता के लिए तुलना कर रहे हैं? यदि नहीं, तो परेशान क्यों? –

+0

@ पॉल - नेटबीन, और यह उत्पन्न करता है; केवल, मुझे हर बार फिर से उत्पन्न करना होगा, और यह कोड की 10 लाइनों को भी बनाता है। इसके अलावा, lib उत्पन्न करते समय प्रतिबिंब का उपयोग कर सकता है, तो यह बराबर संभाल क्यों नहीं सकता? –

उत्तर

10

Project Lombok एनोटेशन @EqualsAndHashCode जो equals() और hashCode() अपने जावा वर्गों के लिए उत्पन्न होगा प्रदान करता है। बेशक इन विधियों को मैन्युअल रूप से कार्यान्वित करने की तुलना में कुछ कमियां हैं, इसलिए सुनिश्चित करें कि आप लिंक किए गए पृष्ठ पर "छोटा प्रिंट" पढ़ लें।

+0

शायद यही वह है जिसे मैं ढूंढता हूं। केवल दयालुता यह नेटबीन के साथ एकीकृत नहीं है। दूसरे पैराग्राफ के लिए –

3

Guava के Objects.hashCode और Objects.equal के बारे में क्या?

+0

नाह ... लेकिन आखिर में मुझे यह देखने के लिए धन्यवाद कि यह क्या करने में सक्षम है। –

1

अपाचे कॉमन्स-लैंग लाइब्रेरी में हैशकोडबिल्डर और इक्वाल्सबिल्डर है जो आपके लिए कुछ काम करेगा और उन तरीकों को छोटा करेगा। यहां तक ​​कि प्रतिबिंब संस्करण भी हैं जो पीओजेओ के क्षेत्रों के आधार पर आपके लिए यह सब कुछ करेंगे। हालांकि, मैं इसकी सिफारिश नहीं करता। प्रतिबिंब धीमा हो सकता है (हालांकि कई लोगों के विचार के रूप में बुरा नहीं है), और आपको यह सुनिश्चित करने के लिए उन्हें लागू करना चाहिए कि केवल सही फ़ील्ड समानता के लिए विचार किए जाएं।

मेरा सवाल है, क्या आपको वास्तव में ऐसा करने की ज़रूरत है? पीओजेओ पर अक्सर हैशकोड और बराबर को केवल मानचित्र या सेट के उपयोग के लिए लागू करने की आवश्यकता होती है। मानचित्र के मामले में, आमतौर पर आप एक कुंजी के लिए एक आईडी का उपयोग करेंगे, जो पोजो स्वयं नहीं है। तो, क्या आप अपने लिए काम कर रहे हैं?

+0

+1, लेकिन कोड में खुदाई करने के बजाय न्यूनतम प्रयास के साथ इसे सही तरीके से करना बेहतर नहीं है, जब एचसी/ईक्यू की बात आती है तो इसे जोड़ना बेहतर होता है? –

+0

सब कुछ की तरह, यह एक व्यापार बंद होने के समाप्त होता है। यह अच्छा है अगर यह सामने हो गया है, लेकिन वास्तव में आवश्यक होने पर इसे लागू करने से मेरे अनुभव में अत्यधिक मुश्किल साबित नहीं हुई है। बेशक, मेरे पास आमतौर पर परीक्षण होते हैं जो मुझे बताते हैं कि जब मैं इसे लागू करना चूक गया। :) – rfeak

2

आप Google की AutoValue लाइब्रेरी का उपयोग स्वचालित रूप से equals और hashCode साथ अपरिवर्तनीय मूल्य वर्गों उत्पन्न करने के लिए कर सकते हैं। ये मूल्य वर्ग कुछ हद तक स्कैला के केस क्लास या लॉमोक द्वारा उत्पन्न किए गए समान हैं।

आईडीई में इसका उपयोग करने के तरीके पर post भी है।

+1

इंटेलिजे के लिए https://plus.google.com/+googleguava/posts/i9sRnkDKcdT देखें –