तुलनात्मक इंटरफ़ेस का अपना equals()
विधि है। ऑब्जेक्ट क्लास के माध्यम से डिफ़ॉल्ट रूप से किसी भी कक्षा को equals()
मिलेगा। एक इंटरफेस के अंदर equals()
विधि की आवश्यकता क्या है?तुलनाकर्ता घोषित क्यों करता है?
उत्तर
जावा documentations, कारण है कि Comparator
यह खुद equals()
विधि है है से:
हालांकि, इस विधि अधिभावी, कुछ मामलों में, प्रदर्शन बेहतर हो सकता अनुमति देकर कार्यक्रमों का निर्धारण करने के लिए कि दो अलग-अलग तुलनाकारक थोपना वहीआज्ञा।
हां, लेकिन इंटरफ़ेस में विधि का उल्लेख करने के लिए अभी भी अनावश्यक है। – aioobe
@aioobe अच्छी तरह से, आपका उत्तर अन्य सभी परिदृश्यों को स्पष्ट करता है। मैं बस ओपी को बताना चाहता था कि इंटरफ़ेस में यह कारण है कि प्रोग्रामर को उस विधि को ओवरराइड करके प्रदर्शन सुधार की ओर इशारा करना है। –
इसे javadoc पढ़ें। यह केवल यह बताने के लिए है कि equals()
को वापस लौटना होगा यदि आप इसे कंप्रेसर लागू करने वाले वर्ग में ओवरराइड करना चुनते हैं। आपको लगता है कि कोई तुलनित्र किसी अन्य के बराबर नहीं हो सकता है, लेकिन ऐसा नहीं है। आप सोच सकते हैं कि दो तुलनित्र बराबर हैं यदि वे किसी भी तर्क के लिए एक ही चीज़ लौटते हैं, लेकिन ऐसा नहीं है। जावाडोक बताते हैं कि दो तुलनित्र बराबर हैं यदि वे वही आदेश देते हैं, जो भी तर्क दिए गए हैं। जावाडोक भी कहते हैं:
ध्यान दें कि यह Object.equals (वस्तु)
अधिकांश समय, आप ओवरराइड नहीं करते equals()
तुलनाकारक में ओवरराइड करने के लिए नहीं हमेशा सुरक्षित है।
Comparator
में equals()
विधि एक उपयोगकर्ता लोगों को पहले से ही Object
से equals()
पर लागू करने के अलावा कुछ अतिरिक्त नियम और बाधाओं के साथ equals()
लागू करने के लिए Comparator
इंटरफेस को लागू करने के लिए मजबूर करने प्रदान की जाती है।
अतिरिक्त नियम से किया जा रहा:
इस विधि Object.equals (वस्तु) के सामान्य अनुबंध का पालन करना चाहिए। इसके अतिरिक्त, यह विधि केवल तभी वापस आ सकती है जब निर्दिष्ट ऑब्जेक्ट एक तुलनित्र भी है और यह तुलनित्र के समान आदेश को लागू करता है। इस प्रकार, comp1.equals (Comp2) का तात्पर्य है कि sgn (comp1.compare (O1, O2)) == sgn (comp2.compare (O1, O2)) हर वस्तु संदर्भ O1 और o2 के लिए।
:
Object.equals (वस्तु) को ओवरराइड करने के लिए नहीं यह हमेशा सुरक्षित है। हालांकि, इस विधि को ओवरराइड करने में, कुछ मामलों में, प्रोग्राम को यह निर्धारित करने की अनुमति देकर प्रदर्शन में सुधार हो सकता है कि दो अलग तुलनाकर्ता एक ही आदेश लगाते हैं।
ठीक है, लेकिन मुझे लगता है कि सवाल यह था कि इंटरफ़ेस में इस विधि का उल्लेख क्यों किया गया है, क्योंकि यह अर्थात् अनावश्यक रूप से बोल रहा है। – aioobe
Comparator
Object.equals
के अनुबंध को परिष्कृत: यह Object.equals
और फिर कुछ द्वारा की कमी बाहर सेट को पूरा करने के है।
इसके अतिरिक्त, यह विधि केवल तभी वापस आ सकती है जब निर्दिष्ट वस्तु एक तुलनित्र भी हो और यह इस तुलनित्र के समान आदेश लागू करे। इस प्रकार,
comp1.equals(comp2)
का अर्थ है कि प्रत्येक ऑब्जेक्ट संदर्भo1
औरo2
के लिएsgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
।
एक equals
Comparator
अंदर की घोषणा आप जावाडोक के रूप में इस दस्तावेज़ के लिए अनुमति देता है।
ध्यान दें कि एपीआई का दस्तावेज भी अनुबंध के रूप में कार्य करता है, इसलिए यह सिर्फ सौंदर्य प्रसाधन नहीं है। यह स्पष्ट बाधा है कि अन्य कोड और आपका कोड भरोसा कर सकता है।
ऐसी स्थितियों में जहां आपके पास कम स्थापित विधियां हैं, यह एक इरादे को दस्तावेज करने के रूप में भी काम कर सकती है। आईई, Interface.method
वहां पर होना चाहिए, इस पर ध्यान दिए बिना कि इसके सुपर इंटरफेस कैसे विकसित होते हैं।
मैं असहमत हूं।विधि का बिंदु तुलनाकर्ताओं के बराबर विधि के अनुबंध को परिशोधित करना है: जब तुलनाकर्ता को बराबर माना जा सकता है और वे कब नहीं कर सकते हैं। आपको लगता है कि कोई तुलनित्र किसी अन्य के बराबर नहीं हो सकता है, लेकिन ऐसा नहीं है। आप सोच सकते हैं कि दो तुलनित्र बराबर हैं यदि वे किसी भी तर्क के लिए एक ही चीज़ लौटते हैं, लेकिन ऐसा नहीं है। जावाडोक स्पष्ट रूप से कहता है कि आपको बराबर ओवरराइड करने की आवश्यकता नहीं है, क्योंकि 'ऑब्जेक्ट.equals() 'अनुबंध को संतुष्ट करता है। –
यह एक वैध टिप्पणी है। अंत में, एपीआई विधि का अनुबंध क्या है? इसका दस्तावेज तो अंत में, यह वही है जो मैं कह रहा हूं, यद्यपि आपने इसे स्पष्ट रूप से स्पष्ट नहीं किया है ;-) थोड़ा सुधारना। – aioobe
अब मैं आपका उत्तर पसंद करता हूं, लेकिन मुझे अभी भी ऑब्जेक्ट क्लास से "decoupling" के बारे में अनुच्छेद का बिंदु नहीं दिखाई देता है। तुलनात्मक * * इस विधि की आवश्यकता नहीं है। –
एक इंटरफ़ेस घोषणा में ऑब्जेक्ट विधि डालने की अनुमति देता है Javadoc अर्थों के बराबर की घोषणा इंटरफ़ेस को लागू करने वाले वर्गों में होना आवश्यक है।
जैसा कि हमारे पास ऑब्जेक्ट में डिफ़ॉल्ट कार्यान्वयन है, संकलक प्रोग्रामर को बराबर लागू करने के लिए बाध्य नहीं करता है अगर यह इंटरफ़ेस में प्रस्तुत किया गया है। लेकिन तुलना करें() वस्तु में परिभाषित नहीं है, यही कारण है कि प्रोग्रामर इसे लागू करना है। – Denys
Comparator interface have their own equals() method
अच्छा ,. सबसे पहले, यह स्पष्ट होना चाहिए कि जब भी आप तुलनात्मक इंटरफ़ेस को कार्यान्वित करते हैं तो आपको यह तय करने के लिए अपना प्रोग्राम प्रदान करना चाहिए कि ऑब्जेक्ट बराबर, कम या अधिक कब हों।
I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class.
बराबर() विधि कार्यान्वयन यू वस्तु वर्ग केवल चेकों से विरासत दो referances एक ही वस्तु या नहीं को इंगित करता है। यह किसी भी तुलना लागू नहीं है। यह आप हैं जो वस्तुओं के बराबर होने के मानदंडों को आपकी कक्षा (या संभवतः आपके इंटरफ़ेस में) प्रदान करेंगे।
Then what is need to have equals() method inside an interface?
जाहिर है, जब भी आप वस्तुओं को कम करते हैं, तब भी लागू होते हैं, जब आप बराबर होते हैं तो आप को लागू करना चाहिए। तो बजाय डिफ़ॉल्ट वस्तु पर निर्भर रहने के बराबर() विधि आप समानता
तकनीकी तौर पर, विधि की घोषणा (संकलक परवाह नहीं करता) अनावश्यक है, लेकिन ...
घोषणा की जाँच करने के लिए अपने तर्क प्रदान करना चाहिए इस इंटरफेस में बराबर विधि कॉलर और विभिन्न तुलनाकर्ताओं के बीच अनुबंध का हिस्सा बनाती है और इसे अपने अर्थशास्त्र को निर्दिष्ट/विस्तारित करने की अनुमति देती है।
यह निर्दिष्ट करता है कि दो तुलनाकर्ता केवल तभी बराबर होते हैं जब वे अपनी तुलना() विधि के साथ एक ही ऑर्डरिंग लगाते हैं। यह ऑब्जेक्ट.equals() के अर्थशास्त्र को बढ़ाता है और इसलिए इंटरफ़ेस में दस्तावेज किया जाना चाहिए।
कभी-कभी स्पष्टीकरण काफी सरल होता है - तुलनात्मक में बराबर विधि अच्छी तरह से सोचा नहीं गया था। इसके लिए कोई गहरा कारण नहीं है। कोई भी तर्क सवाल में डाल सकता है कि क्यों हजारों अन्य वर्ग बराबर अनुबंध को "परिभाषित नहीं करते हैं"। – hawk