जावा 8 और बाद में, इस प्रश्न का उत्तर अभी भी मान्य है, लेकिन अब अधिक बारीक है।
पहले, स्वीकृत उत्तर के ये कथन सही हैं:
- इंटरफेस एक अनुबंध में अपने निहित व्यवहार को निर्दिष्ट करने के लिए हैं (व्यवहार के लिए नियमों का एक बयान जिसे लागू करने के लिए कक्षाओं का पालन करना चाहिए)
- अनुबंध (नियमों) और कार्यान्वयन के बीच अंतर है (नियमों के प्रोग्राम कोडिंग)
- इंटरफ़ेस में निर्दिष्ट तरीके जरूरी हमेशा लागू होते हैं (कुछ बिंदु पर)
तो, जावा 8 में नया क्या है? जब की बात "वैकल्पिक तरीके" निम्न में से कोई अब उपयुक्त हैं:
1. एक विधि जिसका कार्यान्वयन संविदात्मक वैकल्पिक है
"तीसरा कथन" कहता है कि सार इंटरफ़ेस विधियों को हमेशा लागू किया जाना चाहिए और यह जावा 8+ में सही रहता है। हालांकि, जावा कलेक्शंस फ्रेमवर्क में, अनुबंध में "सार" के रूप में कुछ सार इंटरफ़ेस विधियों का वर्णन करना संभव है।
इस मामले में, जो लेखक इंटरफ़ेस को लागू कर रहा है, वह विधि को लागू नहीं करने का विकल्प चुन सकता है। कंपाइलर एक कार्यान्वयन पर जोर देगा, हालांकि, और इसलिए लेखक इस कोड का उपयोग उन वैकल्पिक तरीकों के लिए करता है जिनकी विशेष कार्यान्वयन प्रक्रिया में आवश्यकता नहीं है:
public SomeReturnType optionalInterfaceMethodA(...) {
throw new UnsupportedOperationException();
}
जावा 7 और इससे पहले, यह वास्तव में "वैकल्पिक विधि" का एकमात्र प्रकार था, जो कि एक विधि थी, जिसे लागू नहीं किया गया था, तो एक असमर्थितप्रकरण अपवाद को फेंक दिया। यह व्यवहार आवश्यक रूप से इंटरफ़ेस अनुबंध (उदाहरण के लिए, जावा कलेक्शंस फ्रेमवर्क के वैकल्पिक इंटरफ़ेस तरीके) द्वारा निर्दिष्ट किया गया है।
2. एक डिफ़ॉल्ट विधि जिसका पुन: कार्यान्वयन वैकल्पिक है
जावा 8 ने डिफ़ॉल्ट विधियों की अवधारणा पेश की । ये ऐसी विधियाँ हैं जिनके कार्यान्वयन को इंटरफ़ेस परिभाषा द्वारा ही प्रदान किया जा सकता है और प्रदान किया जाता है। यह आम तौर पर केवल डिफ़ॉल्ट तरीके प्रदान करना संभव है जब विधि निकाय को अन्य इंटरफ़ेस विधियों (अर्थात, "आदिम") का उपयोग करके लिखा जा सकता है, और जब this
इसका अर्थ "यह हो सकता है कि किस वर्ग ने इस इंटरफ़ेस को लागू किया है।"
एक डिफ़ॉल्ट विधि को इंटरफ़ेस के अनुबंध को पूरा करना चाहिए (किसी भी अन्य इंटरफ़ेस विधि के कार्यान्वयन की तरह)। इसलिए, एक कार्यान्वयन कक्षा में इंटरफ़ेस विधि के कार्यान्वयन को निर्दिष्ट करना लेखक के विवेक पर है (जब तक व्यवहार उसके उद्देश्य के लिए उपयुक्त है)।
इस नए परिवेश में, जावा कलेक्शंस फ्रेमवर्क को फिर से लिखा जा सकता है :
public interface List<E> {
:
:
default public boolean add(E element) {
throw new UnsupportedOperationException();
}
:
:
}
इस तरह, "वैकल्पिक" पद्धति add()
में अनएपेरोडऑपरेशन अपवाद को फेंकने का डिफ़ॉल्ट व्यवहार है यदि कार्यान्वयन वर्ग स्वयं का कोई नया व्यवहार प्रदान नहीं करता है, तो ठीक यही है कि आप क्या करना चाहते हैं और जो सूची के लिए अनुबंध के अनुरूप है। यदि कोई लेखक एक वर्ग लिख रहा है जो नए तत्वों को सूची कार्यान्वयन में जोड़ने की अनुमति नहीं देता है, तो कार्यान्वयन add()
वैकल्पिक है क्योंकि डिफ़ॉल्ट व्यवहार बिल्कुल वही है जिसकी आवश्यकता है।
इस मामले में, ऊपर दिया गया "तीसरा कथन" अभी भी सही है, क्योंकि विधि को इंटरफ़ेस में ही लागू किया गया है।
3. एक विधि जो एक Optional
परिणाम लौटाती है
अंतिम नई तरह की वैकल्पिक विधि बस एक विधि है जो एक रिटर्न देती है Optional
। Optional
वर्ग से निपटने का एक निश्चित अधिक वस्तु उन्मुख तरीका प्रदान करता है null
का परिणाम है।
प्रोग्रामिंग की धाराप्रवाह शैली में, जैसे कि आमतौर पर नए जावा स्ट्रीम एपीआई के साथ कोडिंग करते समय किसी भी बिंदु पर एक अशक्त परिणाम प्रोग्राम को NullPointerException के साथ क्रैश करने का कारण बनता है। Optional
वर्ग एक तरीका है कि दुर्घटना के लिए ग्राहक कोड पैदा करने के बिना धाराप्रवाह शैली में सक्षम बनाता है में क्लाइंट कोड को अशक्त परिणाम देने के लिए एक तंत्र प्रदान करता है।