जावा 8 में, मैं आसानी से लिख सकता हूं:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
मुझे पूर्ण सिंक्रनाइज़ेशन शब्दार्थ मिलेगा जो मैं कक्षाओं में भी उपयोग कर सकता हूं। हालाँकि, मैं synchronized
पद्धति घोषणाओं में संशोधन का उपयोग नहीं कर सकता :
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
अब, कोई यह तर्क दे सकता है कि दो इंटरफेस एक ही तरह से व्यवहार करते हैं सिवाय इसके कि Interface2
एक अनुबंध पर method1()
और उस पर स्थापित method2()
होता है, जो कि क्या Interface1
करता है की तुलना में थोड़ा मजबूत है। बेशक, हम यह भी तर्क दे सकते हैं कि default
कार्यान्वयन को ठोस कार्यान्वयन राज्य के बारे में कोई धारणा नहीं बनाना चाहिए, या ऐसा कोई कीवर्ड केवल अपना वजन नहीं बढ़ाएगा।
सवाल:
क्या कारण है कि JSR-335 विशेषज्ञ समूह ने synchronized
इंटरफ़ेस विधियों पर समर्थन नहीं करने का निर्णय लिया ?
default synchronized
, फिर भी इसके लिए जरूरी नहीं है static synchronized
, हालांकि मैं स्वीकार करता हूं कि बाद वाले को निरंतरता कारणों से छोड़ दिया गया हो सकता है।
synchronized
उप-वर्ग में संशोधक को ओवरराइड किया जा सकता है, इसलिए यह केवल तभी महत्वपूर्ण होगा जब अंतिम डिफ़ॉल्ट विधियों के रूप में कुछ था। (आपका अन्य प्रश्न)
synchronized
सुपर क्लास में घोषित तरीकों को ओवरराइड कर सकते हैं , प्रभावी ढंग से सिंक्रनाइज़ेशन को हटा सकते हैं। मुझे आश्चर्य नहीं होगा कि समर्थन synchronized
और समर्थन नहीं final
करना संबंधित है, हालांकि, शायद कई उत्तराधिकार (जैसे विरासत void x()
और synchronized void x()
, आदि) के कारण। लेकिन यह अटकलें हैं। मैं एक आधिकारिक कारण के बारे में उत्सुक हूं, अगर एक है।
super
जिसके लिए पूर्ण पुन: कार्यान्वयन और निजी सदस्यों तक संभव पहुंच की आवश्यकता होती है। Btw, एक कारण है कि उन तरीकों को "रक्षक" कहा जाता है - वे नए तरीकों को जोड़ने की आसान अनुमति देने के लिए मौजूद हैं।