दिलचस्प पोस्ट
स्ट्रिंग में दो स्ट्रिंग्स के बीच स्ट्रिंग प्राप्त करें ग्रिड दृश्य आइटम वर्ग बनाना जीआईटी के "रीबेस – पेरर्स-विलीन" क्या करता है (और क्यों?) सी ++ सरणी रिवर्स संग्रहित प्रक्रिया का उपयोग करके बल्क डालें IntelliJ आइडिया के साथ एसबीटी परियोजना कैसे तैयार करें? एक ब्लॉक पारित होने पर एरे # सॉर्ट कैसे काम करता है? निरर्थक स्ट्रिंग समाप्त करना रनटाइम पर जावा एप्लिकेशन का असली पथ कैसे प्राप्त करें? PHP डेलाइट सेविंग टाइम डिटेक्शन दिए गए योग तक पहुंचने के लिए सभी संभावित संयोजनों को ढूंढना JQuery के साथ बाएं और दाएं माउस क्लिक के बीच अंतर कैसे करें घातक त्रुटि: अपरिभाषित विधि को कॉल mysqli_result :: fetch_all () मैं पीआईपी के साथ अपने $ HOME फ़ोल्डर में पैकेज कैसे स्थापित कर सकता हूं? उपलब्ध JSR-223 स्क्रिप्टिंग भाषाओं की सूची मुझे कहां मिल सकती है?

जावा 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"); } } 

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

Solutions Collecting From Web of "जावा 8 में डिफ़ॉल्ट या डिफेंडर विधियों का उद्देश्य"

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

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

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

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

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

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

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

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

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

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

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

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