2015-09-07 2 views
12

मेरी प्रोजेक्ट में एक निश्चित पुस्तकालय है जिसका उपयोग मैं करता हूं। इस पुस्तकालय में एक इंटरफेस है जिसमें लगभग 15 तरीके हैं।क्या एक श्रोता का प्रतिनिधित्व करने वाले इंटरफ़ेस के तरीकों के लिए डिफ़ॉल्ट कार्यान्वयन जोड़ना ठीक है?

इस इंटरफेस के प्रयोजन यह कुछ घटनाओं है कि पुस्तकालय में उत्पन्न कर रहे हैं के लिए सदस्यता के लिए संभव बनाने के लिए है। एप्लिकेशन में श्रोता वर्ग इस इंटरफ़ेस को कार्यान्वित कर सकता है और ईवेंट प्राप्त करने के लिए लाइब्रेरी में श्रोता के रूप में स्वयं को पंजीकृत कर सकता है।

इस इंटरफ़ेस में सभी विधियां वास्तव में घटनाएं हैं। ऐसे श्रोताओं को हो सकता है जिन्हें इंटरफेस में कई घटनाओं से केवल एक या दो घटनाएं प्राप्त करने की आवश्यकता हो। हालांकि श्रोता केवल कुछ घटनाओं में रुचि रखते हैं, श्रोता को इंटरफ़ेस को विस्तारित करते समय सभी विधियों को लागू करना होता है।

तो मैं इंटरफ़ेस में तरीकों को खाली डिफ़ॉल्ट कार्यान्वयन जोड़ने के लिए इस पुस्तकालय के डेवलपर के लिए कहा।

लेकिन पुस्तकालय डेवलपर डिफ़ॉल्ट कार्यान्वयन को जोड़ने के लिए करते हुए कहा कि यह जावा सर्वोत्तम प्रथाओं का उल्लंघन होगा और इंटरफ़ेस तरीकों में डिफ़ॉल्ट कार्यान्वयन का उपयोग कर मना कर दिया इंटरफेस के प्रयोजन के खिलाफ जाते हैं।

लेकिन, जैसा कि मैं समझ सकता, इस इंटरफ़ेस में एक विधि कुछ कार्रवाई जो इस इंटरफ़ेस का एक implementer में सक्षम होना चाहिए निर्दिष्ट नहीं है। इस इंटरफेस में एक विधि बल्कि एक ऐसी घटना को परिभाषित करती है जिसमें एक कार्यान्वयनकर्ता दिलचस्पी ले सकता है। इसलिए मुझे डिफ़ॉल्ट कार्यान्वयन को जोड़ने के लिए स्पष्ट कारण नहीं दिख रहा है।

तो, यह इंटरफ़ेस करने के लिए डिफ़ॉल्ट कार्यान्वयन जोड़ रहा है जावा सर्वोत्तम प्रथाओं को तोड़ने?

+0

आप कार्यान्वयन के साथ एक इंटरफ़ेस चाहते हैं? वह संकलन भी नहीं करेगा। जब तक मैं आपका प्रश्न समझ नहीं पा रहा हूं। – Manu

+2

जावा 8 में, आप इंटरफेस विधियों के लिए एक डिफ़ॉल्ट कार्यान्वयन निर्दिष्ट कर सकते हैं, जिससे विधि को कार्यान्वित करने के लिए इंटरफेस के कार्यान्वयन के लिए इसे वैकल्पिक बनाया जा सके। –

+0

उसे नहीं पता था। ऐसा लगता है कि यह सुविधा पिछली संगतता के लिए प्रदान की जाती है, जबकि आपको केवल इंटरफेस के बजाय एक अमूर्त वर्ग का उपयोग करना चाहिए। (आपको लाइब्रेरी लड़के की भी आवश्यकता नहीं है, बस इसे स्वयं बनाएं) – Manu

उत्तर

6

लेकिन पुस्तकालय डेवलपर डिफ़ॉल्ट कार्यान्वयन को जोड़ने के लिए, करते हुए कहा कि यह जावा सर्वोत्तम प्रथाओं का उल्लंघन होगा और डिफ़ॉल्ट इंटरफ़ेस तरीकों में कार्यान्वयन इंटरफेस के प्रयोजन के विरुद्ध जाने का उपयोग कर मना कर दिया।

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

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

हालांकि एक श्रोता कुछ घटनाओं में केवल रुचि है:

public interface MyInterface extends LibraryInterface { 
    @Override default public void event1() { 
    } 

    ... 
} 

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

एक समाधान बस कई छोटे में बड़ा इंटरफेस को विभाजित करने के हो सकता है।

1

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

4

लाइब्रेरी डेवलपर इस बारे में गलत है (मुझे आईएमएचओ को छोड़ने की भी हिम्मत है)।

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

तो दुरुपयोग नहीं, एकाधिक वंशानुक्रम कुछ स्थितियों में वांछनीय है और, जैसा कि हम सभी जानते हैं, जावा में एक 'सहायक' वर्ग का विस्तार करके हम कुछ और से विरासत करने की क्षमता खो रहे हैं।

वास्तव में, यह आधिकारिक Java tutorial में बताया गया है, अनुभाग "सार कक्षाएं इंटरफेस की तुलना में":

  • आप: अगर इनमें से कोई कथन आपके स्थिति पर लागू

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

  • आप किसी विशेष डेटा प्रकार के व्यवहार को निर्दिष्ट करना चाहते हैं, लेकिन इसके व्यवहार को लागू करने वाले व्यक्ति के बारे में चिंतित नहीं है।
  • आप कई प्रकार के विरासत का लाभ लेना चाहते हैं।

दूसरा और तीसरा बिंदु आपके उपयोग के मामले के लिए एकदम सही मिलान है।

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

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