2016-09-05 6 views
10

जावा 8 में, हम कंक्रीट कक्षाओं में लागू होने वाली घोषणाओं के अलावा इंटरफेस में विधियों के लिए डिफ़ॉल्ट कार्यान्वयन कर सकते हैं।तरीकों को जोड़ना या इंटरफेस में विधियों को जोड़ना नहीं?

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

कृपया मुझे यह समझने में सहायता करें कि यहां अच्छा डिज़ाइन क्या है, विस्तार से।

+1

क्या आप किसी विधि के 'डिफ़ॉल्ट' कार्यान्वयन शब्द की बात कर रहे हैं? इंटरफेस में किसी विधि को * सामग्री * जोड़ने की कोई अन्य संभावना नहीं है। – Zabuza

+0

http://www.tutorialspoint.com/java8/java8_default_methods.htm ... upvoted क्योंकि मुझे SO पर डुप्लिकेट नहीं मिला। –

+0

डिफ़ॉल्ट तरीकों का उपयोग करके आईएमएचओ नियमित अभ्यास के लिए नियमित रूप से टालना चाहिए, और थोड़ा कठिन बनाना डीबगिंग कर सकता है, और यदि आप वास्तव में संग्रह करना चाहते हैं कि आप सार कक्षाओं के साथ जा सकते हैं क्योंकि वे समान कार्यक्षमता –

उत्तर

-1

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

Let छोटा सा उदाहरण पर विचार को समझने के लिए कि यह कैसे काम करता है:

public interface oldInterface { 
    public void existingMethod(); 
     default public void newDefaultMethod() { 
     System.out.println("New default method" 
       " is added in interface"); 
    } 
} 

निम्नलिखित वर्ग जावा JDK 8

public class oldInterfaceImpl implements oldInterface { 
    public void existingMethod() { 
     // existing implementation is here… 
    } 
} 

क्यों defaut विधि में सफलतापूर्वक संकलन होगा? मौजूदा जेडीके ढांचे को पुन: प्रस्तुत करना हमेशा बहुत जटिल होता है। जेडीके फ्रेमवर्क में एक इंटरफ़ेस को संशोधित करें जो सभी वर्गों को इंटरफ़ेस तक फैलाता है जिसका अर्थ है कि कोई भी नई विधि जोड़ना कोड की लाखों पंक्तियों को तोड़ सकता है। इसलिए, पिछड़े तरीकों से पिछड़े संगत तरीके से इंटरफेस को विस्तारित करने के लिए एक तंत्र के रूप में पेश किया गया है।

नोट:

लेकिन हम compatability.but इसकी हमेशा अनुशंसा की इस पिछड़े हासिल कर सकते हैं इंटरफेस delarations साथ उपयोग करने के लिए ही नहीं है कि वे क्या सबसे अच्छा के लिए उपयोग किया जाता है।

सरल उदाहरण के लिए यदि आप एक interface Human_behaviour आप की तरह to_Walk(); to_Eat(), to_Love(), to_Fight() उदाहरण के लिए एक अनोखा तरीका में हर इंसान वस्तु .Like

के लिए कहते हैं कि हर लागू करने कक्षा में इस इंटरफेस के सभी कार्यों का उपयोग कर सकते है

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

2

पहले java8, आप जब के बारे में विस्तार इंटरफेस की "उचित" तरीके में बात कर versioned capabilities की ओर देख रहे थे:

interface Capability ... 

interface AppleDealer { 
    List<Apples> getApples(); 
} 

और व्यवस्था एक AppleDealer को पुनः प्राप्त करने में, वहाँ है:

आप की तरह कुछ है

public <T> T getCapability (Class<T> type); 

जैसे कुछ केंद्रीय सेवा तो अपने ग्राहक कोड कर रहे होते:

AppleDealer dealer = service.getCapability(AppleDealer.class); 

जब किसी अन्य विधि के लिए की जरूरत ऊपर आता है, तुम जाओ:

interface AppleDealerV2 extends AppleDealer { ... 

और ग्राहकों V2 चाहते हैं कि, बस एक getCapability(AppleDealerV2.class) कॉल करते हैं। जो लोग परवाह नहीं करते हैं उन्हें अपने कोड को संशोधित करने की ज़रूरत नहीं है!

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

इस प्रकार: एक इंटरफ़ेस में नया विधि जोड़ना; और उस विधि को लागू करने के लिए डिफ़ॉल्ट है; किसी भी मौजूदा ग्राहक कोड को तोड़ने के बिना विशाल आगे बढ़ना है!

मतलब: आप मौजूदा इंटरफेस पर डिफ़ॉल्ट विधियों का उपयोग क्यों नहीं करेंगे? मौजूदा कोड परवाह नहीं होगा। यह नए डिफ़ॉल्ट तरीकों के बारे में नहीं जानता है।

0

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

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