2013-11-21 8 views

उत्तर

1

@ एंड्रे, @ एडम मैं आपके द्वारा प्रस्तुत किए गए अंक से सहमत हूं लेकिन असली जावा पुस्तक से मुझे वास्तविक उत्तर मिला है। आइटम # 22 गैरस्टिक पर स्थिर सदस्य वर्गों का पक्ष लें।

निजी स्थिर सदस्य वर्गों के एक आम उपयोग, वस्तु उनके enclosing class.For उदाहरण के प्रतिनिधित्व की घटकों का प्रतिनिधित्व एक मानचित्र उदाहरण है, जो मानों वाली कुंजियों एकत्रित करती है विचार करना है। कई मानचित्र कार्यान्वयन में मानचित्र में प्रत्येक कुंजी-मूल्य जोड़ी के लिए एक आंतरिक प्रविष्टि ऑब्जेक्ट है। जबकि प्रत्येक प्रविष्टि एक मानचित्र से जुड़ी है, किसी प्रविष्टि (getKey, getValue, और setValue) पर विधियों को मानचित्र तक पहुंच की आवश्यकता नहीं है। इसलिए, प्रविष्टियों का प्रतिनिधित्व करने के लिए एक गैरस्टिक सदस्य वर्ग का उपयोग करना अपर्याप्त होगा: एक निजी स्थैतिक सदस्य वर्ग सर्वोत्तम है।

आप एक सदस्य वर्ग है कि एक के लिए उपयोग उदाहरण संलग्न की आवश्यकता नहीं है की घोषणा करते हैं, तो हमेशा अपने declaration.If आप इस संशोधक छोड़ में स्थिर संशोधक शब्दों में कहें, प्रत्येक उदाहरण इसका आवरण उदाहरण के लिए एक बाहरी संदर्भ होगा

आइटम # 22 से बहुत अच्छी चीजें मिलीं लेकिन ऊपर मुख्य बिंदु हैं।

6

असल में सभी आंतरिक कक्षाएं जिन्हें उनके संलग्न वर्गों के गुणों का उपयोग करने की आवश्यकता नहीं है, उन्हें static माना जाना चाहिए। यह जावा में सामान्य सिद्धांत से आता है जो कहता है कि प्रत्येक वस्तु को कम से कम संभव अन्य वस्तुओं तक पहुंच प्राप्त होनी चाहिए।

+0

लेकिन यह किसी अन्य वर्ग से आंतरिक कक्षा तक पहुंचने की एक और संभावना को जोड़ता है। – Vipin

+0

आप "** ** **" से क्या संदर्भित करते हैं? –

+0

"यह" का अर्थ है इन वर्गों के वर्तमान कार्यान्वयन। सेगमेंट के लिए वर्तमान हस्ताक्षर "स्थिर अंतिम श्रेणी सेगमेंट रीन्टेंट्रॉक लॉक लागू करता है Serializabl" – Vipin

2

प्रत्येक भीतरी गैर स्थैतिक कक्षा एक अदृश्य क्षेत्र this$ जो संदर्भ देता है कि उसे अपने जनक वस्तु (ConcurrentHashMap) जो इकाई (Segment या HashEntry) प्रति 8 बाइट्स की एक ओवरहेड बनाता है शामिल हैं। इस प्रकार माता-पिता के वर्ग फ़ील्ड का उपयोग किया जाता है - आंतरिक वर्ग किसी भी प्रकार के सिंटैक्स चीनी में होता है जो एक कंटेनर (जैसे माता-पिता) से संबंधित होता है।

यही कारण है कि जब संभव हो तो आंतरिक कक्षाएं स्थिर आंतरिक कक्षाओं के साथ प्रतिस्थापित की जानी चाहिए।

+0

यह एक अच्छा मुद्दा है, लेकिन यदि यही कारण है कि यह वर्ग निजी नहीं है? – Vipin

+0

यह पैकेज-लोकल है जो पैकेज के लिए निजी जैसा है। मुझे नहीं पता कि उनका इरादा क्या था, लेकिन आम तौर पर निजी संस्थाओं को इकाई-परीक्षण के लिए पैकेज-लोकल बनाया जाता है ताकि कोई उन्हें एक अलग वर्ग (यूनिट टेस्ट) से एक्सेस कर सके। –

+0

शायद परीक्षण के उद्देश्य के लिए केवल जावा लोग डिजाइन के साथ नहीं खेलेंगे, मुझे नहीं पता कि लेखक डौग ली से कैसे पूछ सकते हैं। – Vipin

0

आंतरिक स्थिर वर्ग में एक सुंदर विशेषता है कि वे आलसी लोड किए गए हैं क्योंकि इसे Bill Pugh Singleton कार्यान्वयन में बताया गया है, जब हम सिंगलटन पैटर्न को लागू करते हैं।

स्थिर आंतरिक कक्षा प्रदान करता है अन्य विशेषताएं यह है कि बाहरी आवृत्ति चर उपलब्ध नहीं हैं। यहां से, हम गैर स्थैतिक तरीकों तक पहुंच नहीं सकते हैं। उस स्थिर वर्ग को शुरू करने के लिए अलग-अलग उदाहरण बनाने की आवश्यकता नहीं है, सीधे ClassName.InnerStaticClass.method() का उपयोग करके, विधि को बुलाया जा सकता है।

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