आप यह मानने में सही हैं कि गैर-स्थिर आंतरिक कक्षाओं के लिए उपलब्ध विशेषता पहुंच उच्च युग्मन की ओर ले जाती है, इसलिए कोड गुणवत्ता कम होती है, और (गैर-अनाम और गैर-स्थानीय ) आंतरिक कक्षाएं आमतौर पर स्थिर होनी चाहिए।
आंतरिक स्तर को गैर-स्थिर बनाने के निर्णय के डिज़ाइन निहितार्थ जावा पज़लर्स में रखे गए हैं , पहेली 90 (नीचे उद्धरण में बोल्ड फ़ॉन्ट है। मेरा है):
जब भी आप एक सदस्य वर्ग लिखते हैं, तो अपने आप से पूछें, क्या इस वर्ग को वास्तव में एक संलग्न उदाहरण की आवश्यकता है? यदि उत्तर नहीं है, तो इसे बनाएं static
। आंतरिक कक्षाएं कभी-कभी उपयोगी होती हैं, लेकिन वे आसानी से जटिलताओं को पेश कर सकते हैं जो समझने के लिए एक कार्यक्रम को कठिन बनाते हैं। जेनरिक (पहेली 89), परावर्तन (पहेली 80), और वंशानुक्रम (यह पहेली) के साथ उनके जटिल संपर्क हैं । यदि आप होने की घोषणा Inner1
करते हैं static
, तो समस्या दूर हो जाती है। यदि आप भी होने की घोषणा Inner2
करते हैं static
, तो आप वास्तव में समझ सकते हैं कि कार्यक्रम क्या करता है: वास्तव में एक अच्छा बोनस।
संक्षेप में, एक वर्ग के लिए आंतरिक कक्षा और दूसरे का उपवर्ग होना शायद ही उचित हो। अधिक सामान्यतः, एक आंतरिक वर्ग का विस्तार करने के लिए शायद ही कभी उपयुक्त होता है; यदि आपको अवश्य ही लंबे और कठिन उदाहरण के बारे में सोचना चाहिए। इसके अलावा, static
नेस्टेड कक्षाओं को गैर- से पसंद करें static
। अधिकांश सदस्य वर्ग घोषित किए जा सकते हैं static
।
यदि आप रुचि रखते हैं, तो स्टैक ओवरफ्लो में इस उत्तर में पहेली 90 का अधिक विस्तृत विश्लेषण प्रदान किया गया है ।
यह ध्यान देने योग्य है कि उपरोक्त अनिवार्य रूप से जावा कक्षाओं और ऑब्जेक्ट्स ट्यूटोरियल में दिए गए मार्गदर्शन का एक विस्तारित संस्करण है :
यदि आपको किसी एन्कोडिंग इंस्टेंस के गैर-सार्वजनिक फ़ील्ड और विधियों तक पहुँच की आवश्यकता है, तो एक गैर-स्थिर नेस्टेड क्लास (या इनर क्लास) का उपयोग करें। यदि आपको इस पहुँच की आवश्यकता नहीं है, तो एक स्थिर नेस्टेड क्लास का उपयोग करें।
इसलिए, प्रति ट्यूटोरियल दूसरे शब्दों में आपके द्वारा पूछे गए प्रश्न का उत्तर , गैर-स्थैतिक का उपयोग करने का एकमात्र ठोस कारण है जब एक संलग्नक की गैर-सार्वजनिक क्षेत्रों और विधियों तक पहुंच आवश्यक हो ।
ट्यूटोरियल शब्दांकन कुछ व्यापक है (यही कारण है कि जावा पज़लर्स इसे मजबूत बनाने और इसे संकीर्ण करने का प्रयास करते हैं)। विशेष रूप से, सीधे एन्कोडिंग इंस्टेंस फ़ील्ड तक पहुँचना वास्तव में मेरे अनुभव में कभी भी आवश्यक नहीं रहा है - इस अर्थ में कि इन्हें कंस्ट्रक्टर / मेथड पैरामीटर के रूप में पास करने के वैकल्पिक तरीके हमेशा डिबग और मेंटेन करने में आसान होते हैं।
कुल मिलाकर, मेरी (काफी दर्दनाक) मुठभेड़ वर्गों के सीधे प्रवेश करने वाले आंतरिक वर्गों को डिबगिंग के साथ सामना करना पड़ता है, इस धारणा को मजबूत किया कि यह अभ्यास वैश्विक राज्य के उपयोग से मिलता-जुलता है, इसके साथ जुड़ी हुई बुराइयों के साथ।
बेशक, जावा इसे ऐसा बनाता है कि इस तरह के "क्वासी ग्लोबल" की क्षति संलग्न वर्ग के भीतर निहित है, लेकिन जब मुझे विशेष आंतरिक वर्ग को डिबग करना पड़ा, तो ऐसा महसूस हुआ कि इस तरह की बैंड सहायता ने दर्द को कम करने में मदद नहीं की: मैं अभी भी था किसी विशेष परेशानी वाली वस्तु के विश्लेषण पर पूरी तरह से ध्यान देने के बजाय "विदेशी" शब्दार्थ और विवरण को ध्यान में रखें।
पूर्णता की खातिर, ऐसे मामले हो सकते हैं जहां ऊपर तर्क लागू नहीं होता है। उदाहरण के लिए, map.keySet javadocs के मेरे पढ़ने के अनुसार , यह सुविधा तंग युग्मन का सुझाव देती है और परिणामस्वरूप, गैर-स्थैतिक वर्गों के खिलाफ तर्क को अमान्य करती है:
Set
इस नक्शे में निहित कुंजियों का एक दृश्य लौटाता है । सेट मानचित्र द्वारा समर्थित है, इसलिए मानचित्र में परिवर्तन सेट में प्रतिबिंबित होते हैं, और इसके विपरीत ...
नहीं है कि ऊपर किसी भी तरह आप को बनाए रखने, परीक्षण और डिबग करने के लिए कोड को आसान बना देगा, लेकिन यह कम से कम एक को यह तर्क देने की अनुमति दे सकता है कि जटिलता का मिलान / इच्छित कार्यक्षमता द्वारा उचित है।