2011-06-02 17 views
31

में नेस्टेड/इनर वर्ग मैं एक वर्ग MyClass और एक आंतरिक वर्ग MyNestedClass इस तरह की है। इसके कारण मैं पदानुक्रम तोड़ने के बिना, दो अलग-अलग फाइलों में उन्हें अलग करना चाहता हूं। ऐसा इसलिए है क्योंकि नेस्टेड क्लास प्रोग्रामर को दिखाई नहीं देनी चाहिए जो MyClass का उपयोग करता है।बाहरी फ़ाइल

क्या यह हासिल करने का कोई तरीका है?

+0

समान प्रश्न http: // stackoverflow।कॉम/प्रश्न/2764234/आंशिक-वर्ग-आंशिक-श्रेणी-फ़ाइल – Terrance

+0

मुझे एक ही समस्या थी और इसे हल किया गया: http://stackoverflow.com/q/27284667/1190665 कम से कम यह सबसे अच्छा है जिसके साथ मैं आया हूं। – John

उत्तर

20

आप आंतरिक कक्षा पैकेज निजी बना सकते हैं जिसका अर्थ है कि यह केवल उसी पैकेज में अन्य कक्षाओं से ही पहुंच योग्य होगा। यह मानक जेडीके पैकेज जैसे java.lang या java.util के अंदर छिपी कक्षाओं के लिए भी अक्सर किया जाता है।

pkg में

/MyClass.java

public class MyClass { 
    ... 
} 
pkg में

/MyHiddenClass.java

class MyHiddenClass { 

    final MyClass outer; 

    MyHiddenClass(MyClass outer) 
    { 
     this.outer = outer; 
    } 
    ... 
} 

अब जब आप तरीकों या बाहरी वर्ग के चर आप उन्हें outer. साथ उपसर्ग की जरूरत उपयोग करना चाहते लेकिन आप अनिवार्य रूप से वही कार्यक्षमता प्राप्त करते हैं जब बाहरी उदाहरण का संदर्भ संकलक द्वारा सिंथेटिक रूप से बनाया गया था।

+0

धन्यवाद, इस तरह से किया। – Alp

+7

हालांकि तकनीकी रूप से यह अभी भी एक आंतरिक वर्ग नहीं है। – AJMansfield

+5

'MyClass' के निजी गुण 'MyHiddenClass' से निर्धारणीय नहीं होंगे, और' MyHiddenClass' सुरक्षित नहीं है, निजी नहीं। – SparK

6

नहीं। जावा स्रोत कोड एकाधिक फ़ाइलों में विभाजित नहीं किए जा सकते हैं। आपको सी # में आंशिक कक्षा के समान निर्माण की आवश्यकता होगी, जिसमें जावा नहीं है।

+0

प्रोग्रामर को कक्षा छिपाने के लिए शायद कोई और विकल्प हो सकता है? – Alp

+0

निश्चित रूप से, नीचे दिए गए उत्तरों देखें। – retrodrone

4

ऑब्जेक्ट्स कक्षाएं अभिभावक वर्ग की वस्तुओं के निहित संदर्भ रखती हैं। यदि नेस्टेड कक्षा static नहीं है (यह आंतरिक है) तो आप नहीं कर सकते हैं। लेकिन अगर नेस्टेड क्लास को सीधे माता-पिता के वर्ग के उदाहरणों तक पहुंच की आवश्यकता नहीं है और उसे निजी क्षेत्रों तक पहुंच की आवश्यकता नहीं है, तो रिएक्टर के लिए ठीक होना चाहिए, आंतरिक कक्षा को बाहर ले जाएं और इसे सार्वजनिक घोषित करें (उस पैकेज से बाहर पहुंचा नहीं जा सकता है)।

+0

शब्द की व्याख्या के लिए स्पष्टीकरण – Alp

1

आप दोनों में विस्तारित सार आधार वर्ग बना सकते हैं।

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

4

मुझे लगता है कि आप एक देवता वस्तु या ऐसा कुछ है, refactor में लगता है कि आपके कोड

http://en.wikipedia.org/wiki/God_object

+0

+1 के लिए धन्यवाद। शायद यह सच है। – Alp

2

हाँ, झरना जम्पर इस्तेमाल करते हैं। एक कैस्केड-जम्पर एक अमूर्त और गैर स्थैतिक आंतरिक वर्ग है जिसे कहीं और परिभाषित किया जाता है।

MyClass.java

public class MyClass { 
    public abstract class CascadeJumper {} 
} 

MyNestedClass.java

public class MyNestedClass extends MyClass.CascadeJumper { 
    MyNestedClass(MyClass dollarOne) { 
    dollarOne.super(); // yes, is possible! 
    } 
} 

सादर

+0

मुझे नहीं लगता कि यह कैसे काम कर सकता है। 'MyNestedClass' से आप अभी भी किसी भी अन्य वर्ग के रूप में,' MyClass' के सार्वजनिक विधियों और फ़ील्ड तक पहुंच पाएंगे। – Alphaaa

+0

@ अल्फाए नोप, आप निजी क्षेत्र, निजी enums, निजी कक्षाओं और निजी तरीकों, निजी रचनाकारों, 'MyClestedClass' में' MyClass' से बस सब कुछ का उपयोग कर सकते हैं! कोशिश करो! –

+0

मैंने किया और आप नहीं कर सकते। वास्तव में यहां तक ​​कि सामान्य आंतरिक कक्षाएं इसके अनुसार नहीं हो सकती हैं: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_13.htm। जावा कंपाइलर वास्तव में पैकेज के निजी तरीकों को उत्पन्न करके बाहरी वर्ग के निजी क्षेत्रों तक पहुंच को परिवर्तित करता है और इन उत्पन्न तरीकों में से किसी एक को कॉल के साथ किसी प्रत्यक्ष क्षेत्र तक पहुंच को प्रतिस्थापित करता है। सभी वर्ग प्रभावशाली स्तर पर हैं। – user2219808

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