2009-08-12 7 views
9

जावा प्रोग्रामिंग के लिए, @Deprecated नोटेशन और इंटरफ़ेस विधि का उपयोग करने के कुछ लाभ क्या हैं, लेकिन उस वर्ग पर नहीं जो इसे लागू करता है?केवल इंटरफ़ेस पर @Deprecated नोटेशन का उपयोग करने के क्या फायदे हैं?

public interface Joe { 

    @Deprecated 
    public void doSomething(); 

    ... 
} 

public final class Joseph implements Joe { 

    public void doSomething() { 
     ... 
    } 

    ... 
} 
+0

फिर भी आप इंटरफ़ेस में -ऑनली-विधि को भी कम क्यों करेंगे? बस अपने रिलीज डॉक्स में डाल दें कि "इंटरफ़ेस 'जो' का उपयोग करने के लिए अनुशंसित नहीं किया जाता है।" या कुछ और। – Zack

+0

इंटरफ़ेस और कक्षा के लिए अन्य विधियां हैं। भ्रम के लिए खेद हैक। –

उत्तर

8

मेरा मानना ​​है कि यह जावा भाषा में ही कमी है और एक एनोटेशन में एक विधि निर्दिष्ट करने के लिए बकवास है क्योंकि एनोटेशन के माध्यम से बहिष्कृत किया गया है और कार्यान्वयन वर्ग में विधि को बहिष्कृत नहीं किया गया है।

यह बेहतर होगा अगर विधि के @ बहिष्कृत-नास विरासत में मिला हो। दुर्भाग्य से, ऐसा लगता है कि जावा इसका समर्थन नहीं करता है।

विचार करें कि आईडीई जैसे टूलींगिंग इस स्थिति का इलाज करती है: यदि एक चर के प्रकार को इंटरफ़ेस घोषित किया जाता है, तो @ डिप्रेटेड विधियों को स्ट्राइक के माध्यम से प्रस्तुत किया जा सकता है। लेकिन यदि एक चर के प्रकार को कार्यान्वयन वर्ग घोषित किया गया है और कक्षा हस्ताक्षर में @ डेप्रेटेड शामिल नहीं है, तो विधि को स्ट्राइक के माध्यम से प्रस्तुत किया जाएगा।

मौलिक सवाल यह है कि: एक इंटरफ़ेस में बहिष्कृत करने के तरीके के लिए क्या मतलब है लेकिन एक कार्यान्वयन वर्ग (या एक विस्तारित इंटरफ़ेस में) में नहीं? कक्षा पदानुक्रम में इंटरफ़ेस के नीचे सब कुछ के लिए विधि को बहिष्कृत करने का एकमात्र उचित इरादा है। लेकिन भाषा उस व्यवहार का समर्थन नहीं करती है।

6
मेरी राय में

यह विवादास्पद है: एक पदावनत विधि इंटरफ़ेस परवाह किए बिना नहीं नहीं किया जाना चाहिए यह कार्यान्वयन है (यदि नहीं जवाबी उदाहरण प्रदान करें)

+0

मैं विवादास्पद से आगे जाऊंगा: मैं कहूंगा कि यह संदिग्ध है। मैं निश्चित रूप से कोड समीक्षा में उचित ठहराने के लिए कहूंगा। – CPerkins

+1

क्यों नहीं? इसका मतलब यह है कि बहु-विधि इंटरफेस में एक विधि भविष्य की रिलीज में हटाने की योजना है। –

+0

@ यूजीन: यह सच हो सकता है, लेकिन उदाहरण केवल एक विधि दिखाया गया है। तो, यह इंटरफ़ेस क्यों है यदि इसमें केवल एक विधि है?:/lol – Zack

11

@Deprecated प्रलेखन है। यदि लोग किसी इंटरफ़ेस को कोड करते हैं तो आप उस इंटरफ़ेस के कुछ पहलुओं को बहिष्कृत कर सकते हैं। इस तरह लोगों को इसका उपयोग नहीं करना है।

इंटरफ़ेस का कार्यान्वयन वर्ग एक विवरण है। उस वर्ग में एक विधि इंटरफ़ेस को संतुष्ट करने के लिए होती है लेकिन इसे अपने आप से बहिष्कृत नहीं किया जा सकता है। यह बताते हुए कि विधि उचित हो सकती है या नहीं भी हो सकती है।

इंटरफ़ेस लागू करने वाली एक नई कक्षा का अर्थ है कि आपको बहिष्कृत विधियों को लागू करने की आवश्यकता है। उन्हें शायद तब तक काम करना चाहिए जब तक आपको पता न हो कि कक्षा के ग्राहक बहिष्कृत तरीकों का उपयोग नहीं करते हैं। उदाहरण के लिए, यदि आप एक HTTP सर्वलेट कंटेनर बना रहे हैं तो आपको HttpServletResponse.encodeUrl() विधि को लागू करने की आवश्यकता है, भले ही इसे encodeURL() के पक्ष में बहिष्कृत किया गया हो। ऐसा इसलिए है क्योंकि आपकी कक्षा का कोई उपयोगकर्ता उस बहिष्कृत विधि को कॉल कर सकता है।

+0

"यह बताते हुए कि [कार्यान्वयन] विधि उचित हो सकती है या नहीं हो सकती है।" विशेष रूप से, यह हो सकता है कि इंटरफ़ेस विधि कुछ जो जो के सभी कार्यान्वयन के लिए उपयुक्त नहीं है, लेकिन इस विशेष कार्यान्वयन के लिए उपयुक्त है जोसेफ़ - इस प्रकार इंटरफ़ेस में बहिष्कार लेकिन इस विशेष कार्यान्वयन में नहीं। – drew

0

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

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