जावा 8 की सबसे उपयोगी विशेषताओं में से एक default
इंटरफेस पर नए तरीके हैं। अनिवार्य रूप से दो कारण हैं (वहाँ अन्य भी हो सकते हैं) उन्हें क्यों पेश किया गया है:
- वास्तविक डिफ़ॉल्ट कार्यान्वयन प्रदान करना। उदाहरण:
Iterator.remove()
- जेडीके एपीआई विकास के लिए अनुमति। उदाहरण:
Iterable.forEach()
एपीआई डिज़ाइनर के दृष्टिकोण से, मैं इंटरफ़ेस विधियों पर अन्य संशोधक का उपयोग करने में सक्षम होना पसंद करता हूं, जैसे final
। यह उपयोगी होगा जब सुविधा के तरीकों को जोड़ते हुए, कक्षाओं को लागू करने में "आकस्मिक" को रोका जा सके:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
ऊपर पहले से ही सामान्य अभ्यास है अगर Sender
एक वर्ग थे:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
अब, default
और final
स्पष्ट रूप से कीवर्ड का खंडन कर रहे हैं, लेकिन डिफ़ॉल्ट कीवर्ड खुद ही कड़ाई से आवश्यक नहीं होगा , इसलिए मैं मान रहा हूं कि यह विरोधाभास जानबूझकर है, "शरीर के साथ वर्ग विधियों" (सिर्फ तरीकों) और "इंटरफ़ेस" के बीच सूक्ष्म अंतर को प्रतिबिंबित करने के लिए शरीर के साथ तरीके " (डिफ़ॉल्ट तरीके), यानी मतभेद जो मुझे अभी तक समझ नहीं आए हैं।
कुछ समय में, ब्रायन गोएट्ज का हवाला देते हुए , जैसे इंटरफ़ेस पर static
और final
इंटरफ़ेस के तरीकों के लिए समर्थन अभी तक पूरी तरह से पता नहीं लगाया गया था :
दूसरा हिस्सा है कि हम इंटरफेस में क्लास-बिल्डिंग टूल्स का समर्थन करने जा रहे हैं, जैसे कि अंतिम तरीके, निजी तरीके, संरक्षित तरीके, स्थिर तरीके, आदि। इसका जवाब है: हम अभी तक नहीं जानते हैं
2011 के अंत में उस समय से, जाहिर है, static
इंटरफेस में तरीकों के लिए समर्थन जोड़ा गया था। जाहिर है, इसने JDK पुस्तकालयों के लिए बहुत सारे मूल्य जोड़े, जैसे कि Comparator.comparing()
।
सवाल:
क्या कारण है final
(और यह भी static final
) इसे जावा 8 इंटरफेस के लिए कभी नहीं बनाया?
final
एक विधि को ओवरराइड होने से रोकता है, और यह देखते हुए कि आप इंटरफेस से विरासत में मिली विधियों को कैसे ओवरराइड करते हैं, मैं नहीं देखता कि इसे अंतिम बनाने के लिए यह समझ में क्यों आता है। जब तक यह संकेत नहीं देना था कि यह विधि एक बार इसे ओवरराइड करने के बाद अंतिम है .. उस स्थिति में, शायद qas कठिनाइयाँ हैं? अगर मैं इस अधिकार को नहीं समझ रहा हूं, तो कृपया मुझे kmow दें। दिलचस्प लगता है
final
एक इंटरफ़ेस विधि के डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करने से कक्षाएं लागू करने से रोकने में इसका उपयोग होगा।