6

कोड के लिए एक बहुत ही खराब शैली लेकिन कभी-कभी अपरिहार्य। यह एक चरम उदाहरण है। तोजावा: घोंसला कक्षाओं तक सीमित?

  1. कक्षाओं घोंसले के लिए कुछ सीमा है?
  2. वे समकक्ष हैं?
  3. आप ऐसी स्थितियों से कैसे निपटते हैं? पुस्तकालय बनाएँ?

कोड

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

यह हमेशा से बचने योग्य – Bozho

+1

है क्या यह आपूर्ति कोड वाक्य रचनात्मक रूप से सही है? – nmr

+0

यह कुछ कोड जनरेशन परिस्थितियों में टालने योग्य नहीं है। एक खराब डिजाइन किए गए स्कीमा फ़ाइल पर जैक्सब का उपयोग करते समय मैं गहराई सीमा में भाग गया (जो सौभाग्य से, मैं संपादित कर सकता था)। – Spina

उत्तर

5

कोड के लिए एक बहुत ही खराब शैली लेकिन कभी-कभी अपरिहार्य।

उस कथन का दूसरा भाग पेटेंट झूठा है।कार्यान्वयन स्तर पर नेस्टेड कक्षाओं का उपयोग करना हमेशा संभव है।

मैं कोई समझदार डिज़ाइन किसी वर्ग से अधिक नामित कक्षाओं के घोंसले के कारण, और अज्ञात कक्षाओं को 3 या 4 से अधिक स्तरों के बारे में सोच सकता हूं। (मैं वास्तव में जटिल कॉलबैक के साथ एक ग्रहण आरसीपी आवेदन में गुमनाम इनर क्लासों 3 या 4 स्तरों का उपयोग कर एक बार याद करते हैं। लेकिन वह वास्तव में असामान्य था, और पीछे मुड़कर देखें तो यह एक बुरा विचार था।)

1) है कक्षाओं घोंसले के लिए कुछ सीमा है?

सिद्धांत रूप में सीमा पूरी तरह से योग्य वर्गनामों पर 64K सीमा है। अभ्यास में, सीमा सामान्य ज्ञान है।

2) क्या वे बराबर हैं?

वे? यदि आप पूछ रहे हैं कि नेस्टेड कक्षाएं गैर-नेस्टेड कक्षाओं के बराबर हैं, तो जवाब सभी व्यावहारिक उद्देश्यों के लिए हाँ है ... नेस्टेड कक्षाओं के साथ आप एकमात्र चीज कर सकते हैं जिसे आप नियमित कक्षाओं के साथ नहीं कर सकते हैं, वे साझा चीजें हैं जिन्हें private के रूप में घोषित किया जाता है। और कामकाज पैकेज निजी पर अपनी पहुंच आराम करने के लिए है।

3) आप ऐसी स्थितियों से कैसे निपटते हैं? पुस्तकालय बनाएँ?

मुझे नहीं पता कि आप किस स्थिति के बारे में बात कर रहे हैं। कई कक्षाओं वाले जावा प्रोग्रामों को मॉड्यूलर करने का सामान्य तरीका वर्ग घोंसले के बजाय जावा पैकेज का उपयोग करना है। क्या आप क्या खो रहे हैं?

3

उदाहरण आप दे गैर स्थिर नेस्टेड वर्ग हैं। (आपको नेस्टेड क्लास को तुरंत चालू करने के लिए संलग्न वर्ग के प्रकार की एक वस्तु की आवश्यकता है।) नेस्टेड गैर स्थैतिक वर्गों का शायद ही कभी उपयोग किया जाता है। आम तौर पर आप स्थिर घोंसले वाले वर्गों, या गैर-नेस्टेड कक्षाओं के साथ डिफ़ॉल्ट (पैकेज) दायरे के साथ भी कर सकते हैं।

4

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

घोंसले की गहराई पर कोई स्पष्ट सीमा नहीं है। सबसे प्रासंगिक निहित सीमा जेनरेटेड क्लास फ़ाइल का नाम है, जो रोकथाम पदानुक्रम की प्रतिलिपि बनाता है, यानी FileObject$Format$Words$Some$Continue.class। अंततः फाइल सिस्टम के आधार पर फाइलनाम लंबाई सीमा में चला जाएगा।

+0

अच्छा जवाब है लेकिन मुझे लगता है कि एक्सेसर विधियां केवल तब बनाई जाती हैं जब नेस्टेड क्लास में विधियां पैकेज-प्राइवेट नहीं होती हैं। – helpermethod

+0

@helpermethod - यह गलत है। पहुंच में कोई फर्क नहीं पड़ता। शायद आप 'स्थिर' के बारे में सोच रहे हैं। –

2

Inner Classes and Enclosing Instances (लैंगेज स्पेक में) के रूप में, नेस्टेड क्लास एक स्थिर आंतरिक वर्ग है।

तो मुझे लगता है कि आपके मामले में यह आंतरिक है, घोंसला नहीं है।

आंतरिक मामले में मैं कक्षा को घेरने में कुछ फैक्ट्री इंस्टेंस विधि करता हूं, क्योंकि मुझे अभिव्यक्ति को नया टोटो() नहीं है। नया फू() ... आप एक foo ऑब्जेक्ट प्राप्त करते हैं, लेकिन ऑब्जेक्ट कहां है?

नेस्टेड के लिए, मैं नया Toto.Foo.Bar.Other.And.So.On() करता हूं।

5

सूर्य JVM "वर्ग फ़ाइल प्रारूप" कल्पना में वर्णित के रूप संशोधित UTF-8 65536 बाइट्स एक पूरी तरह से योग्य वर्ग के नाम एक स्ट्रिंग का उपयोग कर के रूप में एन्कोड के लिए की एक सीमा होती है। यह 'u2' क्षमता (16 बिट्स) - निरंतर पूल 'CONSTANT_Utf8_info' संरचना से 'लंबाई' का प्रकार कक्षा फ़ाइलों में कक्षा नामों को संग्रहीत करने के लिए उपयोग किया जाता है।

से maximum length for a java class name

इसके अलावा, जार प्रारूप (ज़िप के आधार पर) 64k की एक अधिकतम फ़ाइल नाम लंबाई है। (Wikipedia, ZIP, File headers।)

तो, वर्ग घोंसले की सीमा तब होती है जब नाम 64k तक पहुंच जाता है, लेकिन मुझे लगता है कि आपकी सैनिटी इससे पहले इसकी सीमा को हिट कर सकती है!

+0

मेरा मतलब फ़ाइल नाम की लंबाई कहना है, यही सवाल अनिवार्य रूप से है - कक्षा का नाम कब तक हो सकता है। ज़िप प्रारूप सीमाओं में फ़ाइल नाम 64k (फ़ाइल सामग्री नहीं) शामिल थे। – mdma

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