2011-08-23 12 views
10

ठीक है, मैं जानता हूँ कि यह नियम है:इंटरफ़ेस केवल शीर्ष-स्तरीय कक्षा में क्यों घोषित किया जा सकता है?

JLS के अनुसार: 8.1.3 इनर वर्ग और संलग्न उदाहरण, भीतरी कक्षाएं स्थिर initializers या सदस्य इंटरफेस की घोषणा नहीं कर सकते हैं। आंतरिक कक्षाएं स्थिर सदस्यों की घोषणा नहीं कर सकती हैं, जब तक कि वे संकलित-समय निरंतर फ़ील्ड न हों।

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

मुझे आश्चर्य है कि क्यों। क्या हो सकता है अगर हमें आंतरिक कक्षा में इंटरफ़ेस घोषित करने की अनुमति है? यदि मैं इसे किसी अन्य कक्षा फ़ाइल में डालूं तो आंतरिक वर्ग शीर्ष-स्तरीय कक्षा नहीं बन जाएगा?

उत्तर

7

यदि मैं इसे किसी अन्य कक्षा फ़ाइल में डालता हूं तो आंतरिक वर्ग शीर्ष-स्तरीय कक्षा नहीं बन जाएगा?

नहीं, यह अभी एक आंतरिक वर्ग है, जो फ़ाइल नाम इंगित करता है (यह IIRC है OuterClass$InnerClass.class) है।

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

public class OuterClass { 
    public static interface InnerInterface { //protected and private would be fine too, depending on what makes sense 
    } 
} 

संपादित करें:: वास्तव में, मैं सवाल पढ़ने में भूलना और के बाद से इंटरफेस वैसे भी स्थिर रहे हैं, यहाँ एक है

आप क्या कर सकते हैं अपने बाहरी कक्षा में स्थिर इंटरफेस की घोषणा, इस प्रकार केवल एक नाम स्थान के रूप में बाहरी उपयोग कर रहा है अद्यतन कोड स्निपेट:

public class OuterClass { 
    public static InnerClass { //static inner class making OuterClass just be a namespace 
    public interface InnerInnerInterface { //protected and private would be fine too, depending on what makes sense 
    } 
    } 
} 

एक समाधान आप दोष यह है कि आप एक विरासत बाधा से चिपक है के साथ, एक सार भीतरी भीतरी वर्ग को परिभाषित कर सकता है के रूप में।

+0

हम्म, रोचक! मुझे कभी नहीं पता कि इंटरफ़ेस को स्थैतिक घोषित किया जा सकता है। यहां "स्थैतिक" का अर्थ क्या है? मैंने गुगल स्टैटिक इंटरफेस की कोशिश की है लेकिन कुछ भी नहीं मिला है। पी/एस: व्याकरण त्रुटि को सही करने के लिए, बस उद्धरण वाली रेखा पर मेरी पोस्ट संपादित करें। –

+2

@ डब्ल्यूएन .: इंटरफेस स्पष्ट रूप से स्थैतिक हैं। यह घोषणा सिर्फ अनावश्यक है। –

+1

@ रयान अच्छा बिंदु, मैंने भी सवाल फिर से पढ़ा और मेरा जवाब अपडेट कर देगा। – Thomas

1

आंतरिक कक्षाएं शीर्ष-स्तरीय कक्षा के कार्यान्वयन के विवरण होने चाहिए और इसलिए ग्राहक के लिए अदृश्य होना चाहिए। किसी भी कार्यक्षमता जिसे आप एक आंतरिक वर्ग तक पहुंचना चाहते हैं, शीर्ष स्तर के वर्ग के माध्यम से किया जाना चाहिए, क्योंकि अवधारणात्मक रूप से बोलना, यह कार्यक्षमता केवल शीर्ष-स्तरीय वर्ग की कार्यक्षमता के रूप में दिखाई देनी चाहिए, ताकि कक्षा डिजाइनर स्वैप कर सकता है या अन्यथा ग्राहकों के निर्माण को तोड़ने के बिना आंतरिक कक्षाओं में भारी बदलाव करें।

+2

यह सब राय का विषय है। यदि आंतरिक कक्षाएं केवल मूल वर्ग के आंतरिक उपयोग के लिए थीं, तो आपको उन्हें 'सार्वजनिक' बनाने की अनुमति नहीं दी जाएगी। – skaffman

2

परिभाषा के अनुसार एक शीर्ष स्तरीय वर्ग और इसकी आंतरिक कक्षा (एसएस) कसकर मिलती है। इंटरफेस युग्मन को कम करने का साधन हैं।

+1

भले ही मुझे आंतरिक कक्षा के लिए केवल उस इंटरफ़ेस का निजी तौर पर उपयोग करने की आवश्यकता हो? –

+0

यह एक अच्छा तर्क नहीं है, क्योंकि मैंने कई निजी, नेस्टेड इंटरफेस लिखे हैं जिनका उपयोग केवल एक वर्ग के दायरे में किया जाता है। –

4

स्थिर बनाम गैर स्थैतिक संदर्भ के संदर्भ में इसके बारे में सोचें। एक "शीर्ष-स्तरीय" वर्ग एक स्थिर संदर्भ स्थापित करता है क्योंकि इसे किसी भी संलग्न उदाहरण के बिना एक्सेस किया जा सकता है। अर्थात। आप मुख्य विधि से शीर्ष-स्तरीय कक्षाओं तक पहुंच सकते हैं। यह एक शीर्ष-स्तरीय वर्ग के किसी भी स्थिर सदस्यों पर लागू होता है। एक आंतरिक वर्ग, हालांकि, न तो मौजूद है और न ही कोई स्थिर संदर्भ स्थापित करता है। इसलिए इसमें कोई स्थैतिक सदस्य नहीं हो सकते हैं, और इसे केवल अपनी कक्षा के उदाहरण के माध्यम से उपयोग किया जा सकता है, जैसे कि कन्स्ट्रक्टर और अन्य इंस्टेंस सदस्य। एक मुख्य विधि से, आप बाहरी कहने में सक्षम नहीं होंगे। अंदर।SOME_FIELD क्योंकि आंतरिक कक्षा के सदस्यों का केवल उस वर्ग के संबंध में अर्थ होता है।

*

+0

यह उत्तर थॉमस के उत्तर को स्पष्ट करेगा। +1। –

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

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