विरासत के साथ @Data एनोटेशन लोमबोक पर चेतावनी बराबर / हैशकोड


101

मेरे पास एक इकाई है जो दूसरे से विरासत में मिली है। दूसरी ओर, मैं बॉयलरप्लेट कोड को कम करने के लिए लोमबोक परियोजना का उपयोग कर रहा हूं, इसलिए मैंने @Dataएनोटेशन रखा । @Dataउत्तराधिकार के साथ एनोटेशन अगली चेतावनी देता है:

समान / हैशकोड लागू करना यदि यह जानबूझकर है, तो @EqualsAndHashCode(callSuper=false)अपने प्रकार में जोड़ें ।

क्या एनोटेशन जोड़ना उचित है @EqualsAndHashCode (callSuper = true)या @EqualsAndHashCode (callSuper = false)? अगर इसे नहीं जोड़ा गया है, तो यह कौन सा है callSuper=falseया callSuper=true?

जवाबों:


125

डिफ़ॉल्ट मान है false। यदि आप इसे निर्दिष्ट नहीं करते हैं और चेतावनी को अनदेखा करते हैं, तो यह आपको मिलता है।

हां, एनोटेट वर्गों @EqualsAndHashCodeपर एक एनोटेशन जोड़ने की सिफारिश की जाती है @Dataजो ऑब्जेक्ट के अलावा कुछ और बढ़ाते हैं। मैं आपको यह नहीं बता सकता कि आपको जरूरत है trueया false, जो आपकी श्रेणी पदानुक्रम पर निर्भर करता है, और केस-बाय-केस आधार पर जांच करने की आवश्यकता होगी।

हालाँकि, किसी प्रोजेक्ट या पैकेज के लिए, आप lombok.configसुपर तरीकों को कॉल करने के लिए कॉन्फ़िगर कर सकते हैं यदि यह ऑब्जेक्ट का प्रत्यक्ष उपवर्ग नहीं है।

lombok.equalsAndHashCode.callSuper = call

देखें विन्यास प्रणाली प्रलेखन यह कैसे काम करता है, और @EqualsEndHashCodeप्रलेखन समर्थित कॉन्फ़िगरेशन कुंजियों के लिए।

प्रकटीकरण: मैं एक लोबोक डेवलपर हूं।


मेरे लिए काम किया। लेकिन बस इस बात को ध्यान में रखें कि इस कॉन्फिगर फाइल को लेने के लिए delombok प्लगइन के लिए इसे java source रूट डायरेक्टरी में रखा जाना चाहिए, रिसोर्स डायरेक्टरी में नहीं, बल्कि src / main / java में और src / main / resource में नहीं
user7777736

1
@ मुझे पता नहीं क्यों डिफ़ॉल्ट गलत है। मुझे इसके विपरीत की उम्मीद थी। इसके अलावा, क्या डिफ़ॉल्ट रूप से सुपर को कॉल करने के लिए स्ट्रींग () प्राप्त करने का एक समान तरीका है? मैं देखता हूं कि मैं "@ToString (callSuper = true)" कर सकता हूं, लेकिन ऐसी कोई कॉन्फ़िगरेशन सेटिंग नहीं देख रहा हूं। धन्यवाद।
डेविड सिएगल

क्या इससे कोई फर्क नहीं पड़ता अगर मैं @Data से पहले या बाद में @EqualsAndHashCode (callSuper = true) जोड़ दूं?
अन्ना क्लेन

@AnnaKlein आदेश कोई फर्क नहीं पड़ता
डैन कार्टर

46

@EqualsAndHashCode(callSuper=true) चेतावनी को हल करना चाहिए।


1
यह आरोपित उत्तर होना चाहिए क्योंकि मुझे नहीं लगता कि रोएल का सुझाव "lombok.equalsAndHashCode.callSuper = कॉल" किया जाना चाहिए बजाय इसके कि प्रत्येक वर्ग के लिए एक निर्णय किया जाना चाहिए।
अन्ना क्लेन

4
@AnnaKlein मुझे ऐसा नहीं लगता। वास्तव में यह उत्तर एक टिप्पणी होना चाहिए, यहाँ कोई नई जानकारी नहीं है, आप मेरे प्रश्न में यह पा सकते हैं। मुझे पता था कि @EqualsAndHashCodeचेतावनी को हल करता है।
पौ

वास्तव में स्वीकृत उत्तर के अनुसार (और नीचे मेरा उत्तर) आपको एनोटेशन में 'कॉलसुपर = सच' या 'कॉलसुपर = गलत' के बीच चयन करना चाहिए।
एडम वाइज

26

मुख्य मूल प्रश्न यह है:

क्या एनोटेशन @EqualsAndHashCode (callSuper = true) या @EqualsAndHashCode (कॉलसुपर = गलत) जोड़ना उचित है?

स्वीकृत उत्तर मूल रूप से सिर्फ:

...वह निर्भर करता है...

उस पर विस्तार करने के लिए, @EqualsAndHashCode पर प्रलेखन का कुछ ठोस मार्गदर्शन है, जिस पर चयन करना है। विशेष रूप से यह, IMHO:

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

इसे थोड़ा सा डिस्टिल करने के लिए: यदि आप किसी सुपरक्लास से विरासत में प्राप्त कर रहे हैं तो 'callSuper = true' को चुन लें, जिसमें या तो कोई राज्य सूचना नहीं है, या वह @Data एनोटेशन का उपयोग कर रहा है, या जिसमें इक्वल्स / हैश का कार्यान्वयन है "स्थिति को ठीक से संभालें" - जिसका अर्थ है कि मैं राज्य मूल्यों का एक उचित हैश लौटाने का मतलब है।


मुझे लगता है कि यह उत्तर है जो अच्छी तरह से बताता है कि कॉलसुपर = झूठ और कॉलसुपर = सच के बीच कैसे चुना जाए।
प्रागीथ

9

यदि आप सुपरक्लास के सदस्यों की तुलना करना चाहते हैं, तो उपयोग करें @EqualsAndHashCode(callSuper=true)। यदि, हालाँकि, आप केवल वर्तमान वर्ग में उन फ़ील्ड्स की तुलना करना चाहते हैं @EqualsAndHashCode(callSuper=false)जो आप डिफ़ॉल्ट विकल्प का उपयोग कर सकते हैं ।

यदि आप Delombok -feature का उपयोग करते हैं, तो आप देख सकते हैं कि अंतर यह है कि जब trueइस रेखा पर सेट किया जाता है, तो यह समतुल्य समान विधि में जोड़ा जाता है if (!super.equals(o)) return false;। यदि आपके पास सुपरक्लास में सदस्य हैं जिन्हें दो वस्तुओं की तुलना करते समय ध्यान में रखा जाना चाहिए, तो सही ढंग से तुलना करने के लिए इसे सही पर सेट करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.