2008-10-17 14 views
352

क्या एक विधि जो एक इंटरफ़ेस विधि लागू करती है उसे @Override के साथ एनोटेट किया जाना चाहिए?क्या हमें एक इंटरफ़ेस के विधि कार्यान्वयन को ओवरराइड करना चाहिए?

javadoc of the Override annotation का कहना है:

इंगित करता है कि एक विधि घोषणा एक सुपर क्लास में एक विधि घोषणा ओवरराइड करने के लिए करना है। यदि इस एनोटेशन प्रकार के साथ एक विधि को एनोटेट किया गया है लेकिन सुपरक्लास विधि को ओवरराइड नहीं करता है, तो संकलक को त्रुटि संदेश उत्पन्न करने की आवश्यकता होती है।

मुझे नहीं लगता कि एक इंटरफ़ेस तकनीकी रूप से एक सुपरक्लास है। या यह है?

Question Elaboration

+5

वाह यह प्रश्न छोटा हो सकता है, लेकिन यह सवाल मुझे चाहिए। धन्यवाद –

+1

मुझे @ ओवरराइड आलेख के लिए प्रतिस्थापन नहीं मिल रहा है (ओरेकल ने हाल ही में पुराने सूर्य ब्लॉग को स्थानांतरित कर दिया है)। क्या आप जानते हैं कि इसे कैसे ढूंढें? –

+3

अब हमारे पास @ 2015 (एन) एनोटेशन होना चाहिए (2015)। इससे चीजें स्पष्ट हो जाएंगी! – Alex

उत्तर

248

आप @Override का उपयोग जब भी संभव हो जाना चाहिए। यह सरल गलतियों को होने से रोकता है। उदाहरण:

class C { 
    @Override 
    public boolean equals(SomeClass obj){ 
     // code ... 
    } 
} 

यह संकलन नहीं करता है क्योंकि यह ठीक से public boolean equals(Object obj) हावी नहीं होता।

वही इंटरफ़ेस लागू करने वाले तरीकों के लिए जाएगा (1.6 और ऊपर केवल) या सुपर क्लास की विधि को ओवरराइड करें।

+138

ध्यान दें कि ** ** जावा 5 में इंटरफेस को लागू करने वाली विधि में @ ओवरराइड एनोटेशन नहीं जोड़ सकता ** - यह एक त्रुटि उत्पन्न करता है। जावा 6 में इसकी अनुमति है। –

+14

उम, नहीं, ऐसा नहीं है। वास्तव में, एक इंटरफ़ेस को लागू करने वाले तरीकों को भरते समय ग्रहण ऑटो-आवेषण @ ओवरराइड। – jjnguy

+14

-1 जब तक उत्तर में इंटरफ़ेस विधि को लागू करने के संबंध में जावा 1.5 से 1.6 के विभिन्न व्यवहारों के बारे में कोई उल्लेख शामिल नहीं है। सिर्फ इसलिए कि मैंने इसे लोगों के लिए एक भ्रमित पहलू देखा है और यह वास्तव में एक उल्लेख की योग्यता है। – Grundlefleck

90

मुझे विश्वास है कि जावैक व्यवहार बदल गया है - 1.5 के साथ यह एनोटेशन को प्रतिबंधित करता है, 1.6 के साथ यह नहीं करता है। एनोटेशन एक अतिरिक्त संकलन-समय की जांच प्रदान करता है, इसलिए यदि आप 1.6 का उपयोग कर रहे हैं तो मैं इसके लिए जाऊंगा।

+0

अतिरिक्त चेक क्या है? –

+15

@ माइकल आप देख सकते हैं कि कोई इंटरफ़ेस हटा दिया गया है या नहीं। –

+2

@Sangdol +1 यह मूल प्रश्न का एकमात्र ठोस और वैध उत्तर है। –

3

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

1

ग्रहण स्वयं @Override एनोटेशन जोड़ देगा जब आप एक इंटरफ़ेस लागू करने वाले वर्ग के निर्माण के दौरान "अनुपूरक विधियां उत्पन्न करें" कहेंगे।

2

मेरे लिए, अक्सर यह एकमात्र कारण है कि कुछ कोड को संकलित करने के लिए जावा 6 की आवश्यकता होती है। यकीन नहीं है कि यह इसके लायक है।

+14

यह इसके लायक है ... – Thilo

11

जेडीके 5.0 आपको @Override एनोटेशन का उपयोग करने की अनुमति नहीं देता है यदि आप इंटरफ़ेस में घोषित विधि को कार्यान्वित कर रहे हैं (इसकी संकलन त्रुटि), लेकिन जेडीके 6.0 इसे अनुमति देता है। तो हो सकता है कि आप अपनी आवश्यकता के हिसाब से अपनी परियोजना वरीयता को कॉन्फ़िगर कर सकें।

3

यह जेडीके के साथ कोई समस्या नहीं है। ग्रहण हेलिओस में, यह लागू इंटरफेस विधियों के लिए @ ओवरराइड एनोटेशन, जो भी जेडीके 5 या 6 है। ग्रहण गैलीलियो के लिए, @ ओवरराइड एनोटेशन की अनुमति नहीं है, जो भी जेडीके 5 या 6.

48

आपको हमेशा विधियों को एनोटेट करना चाहिए @Override यदि यह उपलब्ध है।

जेडीके 5 में इसका मतलब है सुपरक्लास के ओवरराइडिंग विधियों, जेडीके 6, और 7 में इसका मतलब सुपरक्लास के तरीकों को ओवरराइड करना और इंटरफेस के तरीकों को लागू करना है। जैसा कि पहले उल्लेख किया गया है, यह संकलक को त्रुटियों को पकड़ने की अनुमति देता है जहां आपको लगता है कि आप एक विधि को ओवरराइड कर रहे हैं (या कार्यान्वित कर रहे हैं), लेकिन वास्तव में एक नई विधि (विभिन्न हस्ताक्षर) को परिभाषित कर रहे हैं।

equals(Object) बनाम equals(YourObject) उदाहरण बिंदु में एक मानक मामला है, लेकिन इंटरफेस कार्यान्वयन के लिए एक ही तर्क बनाया जा सकता है।

मैं कल्पना करता हूं कि इंटरफेस के कार्यान्वयन विधियों को एनोटेट करना अनिवार्य नहीं है कि जेडीके 5 ने संकलन त्रुटि के रूप में इसे ध्वजांकित किया है। यदि जेडीके 6 ने इस एनोटेशन को अनिवार्य बना दिया है, तो यह पीछे की संगतता को तोड़ देगा।

मैं ग्रहण उपयोगकर्ता नहीं हूं, लेकिन अन्य आईडीई (इंटेलिजे) में, @Override एनोटेशन केवल तभी जोड़ा जाता है जब परियोजना जेडीके 6+ प्रोजेक्ट के रूप में सेट की जाती है। मैं कल्पना करता हूं कि ग्रहण समान है।

हालांकि, मैं इस उपयोग के लिए एक अलग एनोटेशन देखना पसंद करता, शायद @Implements एनोटेशन।

+2

+1, यह उत्तर केवल यही है जो स्थिति को समझाता है। – Pacerier

1

@Override सहित के साथ समस्या यह आपको लगता है कि आप super.theOverridenMethod() विधि है, जो बहुत भ्रमित है कॉल करने के लिए भूल गया बनाता है। यह क्रिस्टल स्पष्ट होना चाहिए। शायद जावा का उपयोग करने के लिए @Interface की पेशकश करनी चाहिए। ओह अच्छा, अभी तक एक और आधा assed जावा खास ...

+3

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

1

एक ठोस वर्ग अधिभावी एक सार विधि, कार्यान्वयन के लिए @Override का उपयोग नहीं है, तो एक खुली बात के बाद से संकलक निरपवाद रूप से आप की चेतावनी देगा है किसी भी अनुपूरक तरीकों। इन मामलों में, एक तर्क दिया जा सकता है कि यह पठनीयता से अलग हो जाता है - यह आपके कोड पर पढ़ने के लिए और अधिक चीजें हैं, कम डिग्री तक, इसे @Override कहा जाता है और @Implement नहीं कहा जाता है।

-1

जावा 6 और बाद के संस्करणों में, आप एक इंटरफेस को लागू करने के तरीके के लिए @Override का उपयोग कर सकते हैं।

लेकिन, मुझे नहीं लगता कि यह समझ में आता है: ओवरराइड का मतलब है कि आप सुपर क्लास में एक विधि है, और आप इसे उप वर्ग में लागू कर रहे हैं।

यदि आप एक इंटरफ़ेस को कार्यान्वित कर रहे हैं, तो मुझे लगता है कि हमें @Implement या कुछ और उपयोग करना चाहिए, लेकिन @Override नहीं।

0

java8 में जावाडोक पढ़ने करके, आप इंटरफ़ेस अवहेलना की घोषणा पर निम्न पा सकते हैं: एक विधि इस टिप्पणी का प्रकार compilers एक त्रुटि संदेश उत्पन्न करने के लिए आवश्यक हैं के साथ टिप्पणी की जाती है, तो

जब तक कम से कम एक निम्नलिखित शर्तों को पकड़ें:

  • विधि सुपरर्ट टाइप में घोषित विधि को ओवरराइड या कार्यान्वित करती है।
  • विधि में एक हस्ताक्षर है जो ओवरराइड है- {@linkplain ऑब्जेक्ट} में घोषित किसी भी सार्वजनिक विधि के बराबर है।

तो, कम से कम जावा 8 में, आपको इंटरफ़ेस विधि के कार्यान्वयन पर @ ओवरराइड का उपयोग करना चाहिए।

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