2010-07-20 15 views
6

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

कृपया मुझे एक विचार दें कि यह जावा स्रोत कोड में क्यों लिखा गया है।

public abstract void run(); 

धन्यवाद

उत्तर

8

java language specification से: तो उसके शरीर हमेशा होता है अर्धविराम, नहीं एक ब्लॉक का प्रतिनिधित्व करती

हर विधि घोषणा एक इंटरफेस के शरीर में, परोक्ष सार है।

एक इंटरफ़ेस के शरीर में प्रत्येक विधि की घोषणा पूरी तरह से सार्वजनिक है।

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

यह अनुमति दी है, लेकिन दृढ़ता से शैली के एक मामले के रूप में हतोत्साहित प्रचुरता से इंटरफ़ेस तरीकों के लिए सार्वजनिक संशोधक निर्दिष्ट करने के लिए,।

अरे, सिर्फ यह पता चला कि मेरी इंटरफ़ेस घोषणाएं खराब शैली हैं, क्योंकि मैं हमेशा public संशोधक का उपयोग करता हूं।


apache Harmony सिर्फ सार्वजनिक संशोधक कहते हैं (uuuh - बुरा शैली)। सन ओरेकल में दोनों संशोधक हैं?मुझे लगता है कि ऐसा इसलिए है क्योंकि 'पुराने संस्करणों' में abstract संशोधक को जोड़ना अनिवार्य था - सिर्फ इसलिए कि जेएलएस ने 'पुराने संस्करणों के साथ संगतता' का उल्लेख किया है।

और फिर: कभी नहीं एक Runnable प्रणाली बदलने :-)

+2

आप पर शर्मिंदा है औरreas_d! :) – willcodejavaforfood

+0

यह अभी भी जवाब नहीं देता है * क्यों * सूर्य लोगों ने 'सार्वजनिक सार' को विशेष रूप से 'रन()' विधि में रखा है। यही उसका पूरा सवाल था। पसंदीदा कोडिंग शैली को इंगित करने के लिए – BalusC

+0

+1। मेरी इंटरफ़ेस घोषणाएं अभी भी खराब शैली रही हैं;) – chrisbunney

14

'सार्वजनिक' घोषणा, यह भी बेमानी है, क्योंकि सभी प्रतीकों एक अंतरफलक में डिफ़ॉल्ट रूप से सार्वजनिक कर रहे हैं।

शायद यह आदत से बाहर इस तरह लिखा गया है। मुझे लगता है कि Runnable जेडीके 1.0 में अनुमानित इंटरफेस के पहले मुट्ठी भर में था, और उस समय, इंटरफेस के लिए घोषणापत्र डिफ़ॉल्ट रूप से जेडीके डेवलपर्स के दिमाग में पूरी तरह से स्थापित नहीं हुआ था। मुझे जेम्स गोस्लिंग के साथ एक साक्षात्कार में पढ़ना याद है, कि ओक में, जावा बनने के लिए प्रोजेक्ट का नाम, एक बार इंटरफेस नहीं था, केवल सी ++ जैसे अमूर्त वर्ग थे, और यह उस से एक हैंगओवर हो सकता है।

मैं कभी-कभी इंटरफ़ेस विधियों और स्थिरांक के लिए "सार्वजनिक" भी लिखता हूं, हालांकि यह आवश्यक नहीं है।

+0

हां मुझे पता है और मैं जानना चाहता हूं कि क्यों चलने योग्य इंटरफ़ेस का जावा कोड इस तरह लिखा गया है क्योंकि इसे किसी भी सार्वजनिक और अमूर्त कीवर्ड की आवश्यकता नहीं है, मैंने जावा नींव द्वारा दिए गए अन्य इंटरफेस की जांच की है लेकिन सभी सामान्य हैं केवल इस इंटरफ़ेस में यह है भ्रमित परिभाषा मुझे किसी भी जावा फोरम पर कुछ भी नहीं मिला है, इस – viren

+1

की तरह चलने योग्य क्यों लिखा गया था, मैं अपने उत्तर में बताता हूं कि मुझे ऐसा क्यों लगता है कि यह इस तरह लिखा गया है। जब कोई इंटरफेस नहीं था, तो केवल अमूर्त वर्गों की तुलना में यह एक फेंकने की संभावना है। यह कोई वास्तविक नुकसान नहीं करता है, इसलिए किसी को भी इसे हटाने के लिए परेशान नहीं किया गया है, क्योंकि इससे अच्छा से अधिक नुकसान हो सकता है (हालांकि अभी यह देखना मुश्किल है कि यह कितना नुकसान हो सकता है।) – mdma

+0

@ विली - एक प्रोग्रामिंग भाषा आमतौर पर अस्पष्ट होती है, और नहीं एक तरह से या किसी अन्य तरीके से काम नहीं करते हैं। इंटरफेस के लिए, जेएलएस का कहना है कि सभी इंटरफेस सदस्य पूरी तरह से सार्वजनिक हैं। जेएलएस देखें, 9.1.5: http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#17145 – mdma

1

इंटरफ़ेस में सभी विधियां सार्वजनिक और सार हैं, लेकिन आपको वास्तव में कीवर्ड का उपयोग करने के लिए निर्दिष्ट करने की आवश्यकता नहीं है। यह आपके लिए स्वचालित रूप से किया जाएगा। आपके पास void run() हो सकता है और इसका मतलब वही होगा।

+0

हां मुझे पता है और मैं जानना चाहता हूं कि चलने योग्य इंटरफ़ेस का जावा कोड क्यों लिखा गया है इस तरह क्योंकि इसे किसी भी सार्वजनिक और अमूर्त कीवर्ड की आवश्यकता नहीं है। – viren

+0

उसने यह नहीं पूछा था। उन्होंने पूछा कि यह जावा स्रोत कोड में 'सार्वजनिक सार' के साथ क्यों दिखाई दे रहा है जबकि अन्य इंटरफेस में वे सही ढंग से छोड़े गए हैं। – BalusC

+0

ठीक है हम इसका उत्तर नहीं दे सकते क्योंकि ऐसा करने का कोई कारण नहीं है ... – willcodejavaforfood

0

कारण यह जावा स्रोत कोड में इस तरह लिखा गया है, क्योंकि यह लेखक द्वारा अनदेखी की गई है।

परिभाषा:

public abstract void run(); 

बिल्कुल परिभाषा रूप में ही है:

public void run(); 
एक अंतरफलक में

। यह सिर्फ शैली का मामला है। जावा इंटरफेस में यह पसंदीदा शैली है कि इंटरफ़ेस विधियों को सार्वजनिक और अमूर्त कीवर्ड के बिना परिभाषित किया जाना चाहिए।

ध्यान दें कि इंटरफ़ेस में इन दो विधि परिभाषाओं के बीच कार्यक्षमता में कोई अंतर नहीं है।

0

यह एक सुंदर व्यर्थ प्रश्न की तरह लगता है। कम से कम यह पूछने के लिए एक व्यर्थ जगह है। आपको लेखक से पूछना होगा। जिसके लिए वह शायद 'कौन परवाह करता है' जवाब देगा?

+0

यह दिलचस्प है। बस इतना ही। – noamtm

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