दिलचस्प पोस्ट
ओपनएसएसएल: पीईएम दिनचर्या: पीएएम_रेड_बिओ: कोई प्रारंभ पंक्ति नहीं: pem_lib.c: 703: अपेक्षित: ट्रस्टेड सर्टिफिकेट दूसरी कॉल पर एचटीटीपी वेबबर्म बार का समय जावास्क्रिप्ट में बच्चों और बच्चों के बीच अंतर क्या है? कोणीय जेएस: कोणीय क्यों {angular} में {{}} से बेहतर है? रैंड () कैसे काम करता है? क्या यह कुछ प्रवृत्ति है? क्या उपयोग में कुछ बेहतर है? पायथन में परिपत्र निर्भरता NSPredicate अभिव्यक्ति में SUBQUERY की त्वरित व्याख्या java.lang.IllegalArgumentException: एक पथ विभाजक है "यदि" महंगा है? स्थिर तरीके धागे सुरक्षित हैं क्या मैं #define, enum या const का उपयोग करना चाहिए? क्या std :: string को पास करने के समय और एक पैरामीटर के रूप में? मुझे आईडीई का उपयोग क्यों करना चाहिए? क्या Node.js देशी Promise.all प्रसंस्करण में समानांतर या क्रमिक रूप से? मैं जेएस को आवेदन रूट के बारे में कैसे जान सकता हूं?

जावा 8 में डिफ़ॉल्ट या डिफेंडर विधियों का उद्देश्य

जावा 8 में डिफेंडर विधियों नामक एक नई सुविधा शामिल है जो इंटरफ़ेस में डिफ़ॉल्ट पद्धति कार्यान्वयन के निर्माण की अनुमति देती है।

अब सबसे पहले यह जावा में सभी कंडेनड प्रोग्राम्स के लिए एक विशाल प्रतिमान बदलाव है। मैंने मस्तिष्क गोएट्ज द्वारा दिए गए एक JavaOne 13 प्रस्तुति को देखा जहां वह संग्रह के पुस्तकालय में नई stream() और parallelStream() stream() parallelStream() कार्यान्वयन के बारे में चर्चा कर रहा था।

Collection इंटरफ़ेस में नए तरीकों को जोड़ने के लिए, वे पिछले संस्करणों को तोड़ने के बिना सिर्फ एक नई विधि जोड़ नहीं सके। इसलिए उन्होंने कहा कि यह खानपान करने के लिए डिफ़ॉल्ट तरीकों की एक नई सुविधा जोड़ा गया था।

 public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } 

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

वेब के समाधान से एकत्रित समाधान "जावा 8 में डिफ़ॉल्ट या डिफेंडर विधियों का उद्देश्य"

भविष्य के संस्करणों में अंतरफलक के तरीकों को जोड़ने की संभावना के अलावा, एक interface को एक कार्यात्मक इंटरफ़ेस रहने की इजाजत देने का महत्वपूर्ण बिंदु है, भले ही उसकी एक से अधिक विधि हो।

कार्यात्मक इंटरफ़ेस में केवल एक गैर-मूलभूत सार पद्धति है जो लैम्ब्डा अभिव्यक्ति के माध्यम से कार्यान्वित की जा सकती है। एक उदाहरण एक इंटरैक्टिव इंटरैक्ट है जिसमें केवल एक सार पद्धति ( test ) है, जबकि एक Predicate को अस्वीकार करने के लिए या किसी अन्य Predicate साथ संयोजन के लिए डिफ़ॉल्ट तरीके प्रदान करते हैं। डिफ़ॉल्ट विधियों के बिना इन तरीकों को पूर्व-जावा 8 Collections क्लास जैसे अन्य उपयोगिता वर्ग में प्रदान किया जाना था (जैसा कि आप ऐसे interface लिए लैम्ब्डा लागू करने की संभावना नहीं छोड़ना चाहते हैं)।

जैसा आपने कहा था, मुख्य प्रेरणा मौजूदा इंटरफेस के विकास की अनुमति दे रहा था।

हालांकि ऐसे कारण हैं कि आप उन्हें नए इंटरफेस में भी क्यों इस्तेमाल करना चाहते हैं:

ऐसा एक कारण ऐसे तरीके हैं जो इंटरफ़ेस के अन्य (गैर-डिफ़ॉल्ट) तरीकों का उपयोग करके आसानी से लागू किया जा सकता है। इसके लिए default विधियों का उपयोग करना Foo -interface / AbstractFoo -base-implementing संयोजनों की आवश्यकता कम करता है (उदाहरण के लिए एब्रिक्सलिस्ट देखें)।

हालांकि यह एक पूरी तरह से नया क्षेत्र नहीं बना रहा है, इसका मतलब है कि आपके पास अंत-उपयोगकर्ता-अनुकूल इंटरफेस (बहुत से उपयोगी तरीकों के साथ) हो सकता है, जबकि इसे लागू करने में सरलता रखते हुए

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

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

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

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

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

  1. डिफ़ॉल्ट विधियों ने कार्यात्मक प्रोग्रामिंग अवधारणा को संभव बनाया। कार्यात्मक प्रोग्रामिंग टाइप कोड के लिए हमें केवल एक सार विधि की आवश्यकता है
  2. अंतरफलक में एक विधि जोड़ने के लिए यह एक इंटरफ़ेस को लागू करने वाले सभी वर्गों के लिए अनिवार्य नहीं होगा। कोडिंग अभ्यास को सरल बनाया