2009-03-13 10 views
133

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

इसका क्या फायदा होगा?

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

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

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

उत्तर

140

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

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

+1

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

+0

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

+2

tsk tsk ... चेतावनी के बिना कि यह अप्रचलित है ... – Uri

9

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

+0

यह सही जवाब होना चाहिए। यहां एक अद्यतन [लिंक] है (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) - "नोट" अनुभाग देखें – mork

+0

जेएलएस यह नहीं कहता कि कीवर्ड इंटरफेस में विधियों के लिए अप्रचलित है। यह कहता है "इंटरफ़ेस में घोषित विधि के लिए सार्वजनिक और/या अमूर्त संशोधक को अनावश्यक रूप से निर्दिष्ट करने के लिए, शैली की बात के रूप में इसे अस्वीकार कर दिया गया है, लेकिन इसे निराश किया गया है।" [जेएलएस # 9.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4)। – EJP

+0

@EJP मैंने यह नहीं कहा कि जेएलएस ने कहा है कि कीवर्ड अप्रचलित हो जाएगा, यह मेरी व्यक्तिगत राय थी;) बीटीडब्ल्यू वे इस कीवर्ड को "अनावश्यक" मानते हैं जो अप्रचलित के समान नहीं है, इस में आप सही हैं पाठ्यक्रम। अब मुझे पता है कि मैं इसे स्पष्ट करने के लिए उत्तर संपादित करूंगा। – dhiller

38

"इस बात का बेनिफिस" jdt eclipse compiler in jdk1.3 साथ ग्रहण में एक पुराने अनुकूलता मुद्दा होगा (इंटरफ़ेस तरीकों घोषणा पर सार जोड़ने)

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

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

+3

अच्छा खोज। इसलिए ग्रहण कंपाइलर में अब तक मौजूद किसी भी समस्या के आसपास काम करने की कार्यक्षमता है। – jdmichal

+1

@jdmichal: बिल्कुल, और यह उरी के प्रश्न का एक और सटीक उत्तर भी है। – VonC

34

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

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

संबंधित मुद्दे