java जावा 8: आभासी एक्सटेंशन विधियों बनाम सार वर्ग




interface java-8 (4)

मैं जावा 8 इंटरफेस में नए वर्चुअल एक्सटेंशन विधियों को देख रहा हूं:

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

मैं समय के साथ एक इंटरफ़ेस विकसित करने की अनुमति दे रहा हूं, और एक से अधिक विरासत बिट के लिए, लेकिन वे मेरे लिए एक अमूर्त वर्ग की तरह भयानक लग रहे हैं

यदि आप नया काम कर रहे हैं तो क्या "इंटरफ़ेस" को कार्यान्वित करने के लिए विस्तारित विधियों पर विचार किया गया अमूर्त वर्ग हैं या ये दोनों दृष्टिकोण अवधारणा के बराबर हैं?


नीचे के क्षेत्रों में java-8 इंटरफेस पर सार वर्ग स्कोर।

  1. सार कक्षाओं के साथ, आप उन क्षेत्रों की घोषणा कर सकते हैं जो स्थैतिक और अंतिम नहीं हैं , और सार्वजनिक, संरक्षित, और निजी ठोस विधियों को परिभाषित करते हैंइंटरफेस के साथ, सभी फ़ील्ड स्वचालित रूप से सार्वजनिक, स्थिर और अंतिम होते हैं, और सभी विधियां जिन्हें आप घोषित करते हैं या परिभाषित करते हैं (डिफ़ॉल्ट विधियों के रूप में) सार्वजनिक हैं

  2. परिवर्तनशील राज्य को इंटरफ़ेस के विपरीत बाल कक्षाओं के साथ साझा / संशोधित किया जा सकता है जो केवल स्थिरांक है

  3. सार वर्ग को Template_method_pattern लागू करने के लिए इस्तेमाल किया जा सकता है: यह एक ऑपरेशन में एक एल्गोरिथ्म के प्रोग्राम कंकाल को परिभाषित करता है, जो कुछ उपायों को उप-कक्षाओं में निर्दिष्ट करता है।
  4. सारवृक्ष का प्रयोग सजावटी_पाटन को लागू करने के लिए किया जा सकता है: एक डिज़ाइन पैटर्न जो व्यवहार को किसी एक व्यक्ति के ऑब्जेक्ट में जोड़ा जा सकता है, या तो स्थिर या गतिशील रूप से, उसी श्रेणी से अन्य वस्तुओं के व्यवहार को प्रभावित किए बिना।

कुछ सामान्य व्यवहार (विधियों) प्रदान करने के लिए, सार कक्षाएं राज्य (उदाहरण फ़ील्ड) को पकड़ती हैं।
आप आमतौर पर (कभी नहीं?) राज्य के बिना एक सार वर्ग को देख सकते हैं।

इंटरफेस कार्यक्षमता निर्दिष्ट करें वे एक अनुबंध के रूप में व्यवहार को घोषित करने के लिए हैं, इसे लागू नहीं करें
इस प्रकार किसी भी तरीके जो किसी इंटरफ़ेस के हिस्से के रूप में निर्दिष्ट हैं, "सहायक" विधि हैं - वे कार्यान्वयन को प्रभावित नहीं करते हैं


  1. सार कक्षाएं लैम्ब्डा अभिव्यक्ति के रूट क्लास नहीं हो सकती हैं, जबकि वर्चुअल विस्तार विधियों के साथ इंटरफेस हो सकते हैं।
  2. सार वर्गों में कंसल्टर्स और सदस्य वैरिएबल हो सकते हैं, जबकि इंटरफेस नहीं कर सकते। मेरा मानना ​​है कि यह संभव निर्माता का निष्पादन, और एक जाँच अपवाद के संभव फेंकना जो अमूर्त वर्गों को लैम्ब्डा अभिव्यक्ति की जड़ होने से रोकता है।

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


इस तरह के निर्माण का एक प्राथमिक उद्देश्य पीछे संगतता को संरक्षित करना है। जावा भाषा को बंद करने के अलावा काफी बड़ा बदलाव है, और इसे पूरी तरह से इसका लाभ उठाने के लिए अपडेट किए जाने की आवश्यकता है। उदाहरण के लिए, जावा 8 में Collection में ऐसे तरीके होंगे, जो कि forEach() lambdas forEach() के साथ संयोजन में काम करते हैं। बस पहले से मौजूद Collection अंतरफलक के लिए ऐसी विधियां जोड़ना संभव नहीं होगा, क्योंकि यह पीछे की संगतता को तोड़ देगा। मैंने जो जावा 7 को लागू करने के Collection में लिखा था, वह अब संकलन नहीं करेगा क्योंकि इसमें इन विधियों की कमी होगी। नतीजतन, इन विधियों को एक "डिफ़ॉल्ट" क्रियान्वयन के साथ पेश किया जाता है यदि आप स्काला को जानते हैं, तो आप देख सकते हैं कि जावा interface स्कला trait तरह अधिक होते जा रहे हैं।

इंटरफेस बनाम सार कक्षाओं के लिए, दो अभी भी जावा 8 में अलग हैं; आप अभी भी एक इंटरफ़ेस में एक निर्माता नहीं हो सकता है, उदाहरण के लिए। इसलिए, दोनों दृष्टिकोण "प्रतिरूपिक रूप से समतुल्य" नहीं हैं सार वर्ग अधिक संरचित हैं और उनके साथ एक राज्य हो सकता है, जबकि इंटरफेस नहीं हो सकता। आप अपने कार्यक्रम के संदर्भ में जो भी अधिक समझ लेते हैं उसका उपयोग करना चाहिए, जैसे आप जावा 7 और नीचे में करेंगे।





abstract-class