कोई जावा इंटरफ़ेस विधि को अमूर्त क्यों घोषित करेगा?


143

मैंने मौजूदा वर्ग के आधार पर एक इंटरफ़ेस बनाने के लिए ग्रहण के "पुल इंटरफ़ेस" को फिर से शुरू करने की सुविधा का इस्तेमाल किया। संवाद बॉक्स ने नए इंटरफ़ेस के सभी नए तरीकों को "सार" विधियों के रूप में बनाने की पेशकश की।

उससे क्या फायदा होगा?

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

ग्रहण ऐसी शैली का समर्थन क्यों करेगा, या कोई स्वेच्छा से ऐसा करने के लिए क्यों चुनेगा?

स्पष्टता: मैं यह नहीं पूछ रहा हूं कि इंटरफ़ेस के तरीके अमूर्त क्यों हैं, यह स्पष्ट है। मैं पूछ रहा हूं कि कोई स्पष्ट रूप से उन्हें अमूर्त के रूप में चिह्नित करने का चयन क्यों करेगा क्योंकि वे एक ऐसे इंटरफ़ेस में हैं जो वे वैसे भी अमूर्त हैं।

जवाबों:


146

जावा लैंग्वेज स्पेसिफिकेशन के अनुसार , abstractइंटरफेस के लिए कीवर्ड अप्रचलित है और इसका उपयोग नहीं किया जाना चाहिए। (धारा 9.1.1.1)

कहा कि, जावा की बैकवर्ड संगतता के लिए प्रवृत्ति के साथ, मुझे वास्तव में संदेह है कि क्या यह कभी फर्क पड़ेगा कि क्या abstractकीवर्ड मौजूद है।


1
यह मेरी समझ थी (हालांकि मैं विशिष्ट जेएलएस अनुभाग से परिचित नहीं था)। मैं सोच रहा हूं कि ग्रहण मुझे एक अचूक अंकन बनाने का विकल्प क्यों देगा ...
उरई

मुझे मिला। कहीं न कहीं किसी ने यह तय किया होगा कि यह एक वांछनीय "विशेषता" है और इसे अंदर रखें। आप जानते हैं, उन में से एक खुले रूप से स्रोत :) :)
jdmichal

18
यद्यपि यह शीर्ष-रेटेड उत्तर है, यह विशिष्टता के गलत खंड का जिक्र है; 9.1.1.1 abstractइंटरफ़ेस की घोषणा पर कीवर्ड का वर्णन कर रहा है, इसके सदस्यों पर नहीं। @ नीचे दिए गए उत्तर का उत्तर सही है और इसमें मान्य लिंक स्रोत भी हैं।
झबरा मेंढक

39

ग्रहण में "उस का लाभ" (इंटरफ़ेस विधियों की घोषणा में सार जोड़ते हुए) jdk1.3 में jdt ग्रहण संकलक के साथ एक पुराना संगतता मुद्दा होगा।

1.4 के बाद से, jdk पुस्तकालयों में अब डिफ़ॉल्ट अमूर्त विधियाँ नहीं हैं (इंटरफेस को लागू करने वाले अमूर्त वर्गों पर)।
यह ग्रहण 1.3 संकलक निदान को बेवकूफ बना रहा है क्योंकि उनका कार्यान्वयन उनके अस्तित्व पर निर्भर है।
ध्यान दें कि Javac 1.3 1.4 पुस्तकालयों (-bootclasspath विकल्प का उपयोग करके) के खिलाफ प्रदर्शन करने के लिए पूरी तरह से मना कर देगा।

चूंकि ग्रहण संकलक 1.4 अनुपालन स्तर (देखें Workbench>Preferences>Java>Compiler>JDK Compliance) में होने की संभावना है , या 1.3 अनुपालन मोड का उपयोग करते हुए कम से कम 1.3 वर्ग पुस्तकालयों का उपयोग करें, वर्तमान ग्रहण परियोजनाओं में से अधिकांश में "अमूर्त" की उपस्थिति की आवश्यकता नहीं है।


3
अच्छा मिल गया। इसलिए यह काम करता है कि एक्लिप्स कंपाइलर में बिना किसी मौजूदा समस्या के काम करना है।
जम्मिछाल

1
@jdmichal: वास्तव में, और यह उरी के सवाल का अधिक सटीक उत्तर भी है।
वॉन मार्क

39

से जावा SE 7 JLS (जावा भाषा विशिष्टता): "यह अनुमति है, लेकिन शैली के एक मामले के रूप में हतोत्साहित, प्रचुरता से सार्वजनिक और / या एक विधि के लिए सार संशोधक निर्दिष्ट करने के लिए एक अंतरफलक में घोषित कर दिया।"

के लिए जावा SE 5.0 : "जावा मंच के पुराने संस्करणों के साथ संगतता के लिए, यह अनुमति दी है, लेकिन शैली के एक मामले के रूप में, हतोत्साहित किया जाता है, प्रचुरता से निर्दिष्ट करने के लिए तरीकों के लिए सार संशोधक इंटरफेस में घोषित कर दिया।"


9

JLS विधियों के अनुसार इंटरफेस में डिफ़ॉल्ट रूप से अमूर्त हैं, इसलिए कीवर्ड निरर्थक है। यह जानकर, मैं इसका उपयोग कभी भी "प्रस्तुतिकरण अव्यवस्था से बचने के लिए" नहीं करूँगा।


यह सही उत्तर होना चाहिए। यहां एक अद्यतन लिंक है - "नोट" अनुभाग देखें
mork

जेएलएस यह नहीं कहता है कि इंटरफेस इंटरफेस में तरीकों के लिए अप्रचलित है। यह कहता है "यह अनुमति है, लेकिन शैली में एक बात के रूप में हतोत्साहित किया जाता है, सार्वजनिक रूप से और / या अमूर्त संशोधक को एक इंटरफ़ेस में घोषित विधि के लिए निर्दिष्ट करने के लिए।" JLS # 9.4
लोर्ने

@EJP मैंने यह नहीं कहा कि JLS ने कहा कि यह कीवर्ड अप्रचलित होगा, यह मेरा व्यक्तिगत विचार था;) BTW वे इस कीवर्ड को "निरर्थक" मानते हैं, जो अप्रचलित जैसा नहीं है, इसमें आप बिल्कुल सही हैं । अब जब मुझे पता है कि मैं इसे स्पष्ट करने के लिए उत्तर को संपादित करूँगा।
डेनियल हिलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.