2011-02-28 5 views
6

पर विचार करें यह (अनाम):बेनामी इनर क्लास (गैर-अज्ञात आंतरिक वर्ग पर) के क्या फायदे हैं?

speakBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null); 
    }}); 

बनाम इस: (गैर-अनाम):

class MyOuterClass { 
    private class MyOnClickListener implements OnClickListener { 
     @Override 
     public void onClick(View view) { 
      mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null); 
     } 
    } 

    // later (inside some method)... 
     speakBtn.setOnClickListener(new MyOnClickListener()); 
} 

लाइनों की कम संख्या के अलावा, क्या कोई अन्य लाभ अनाम रूप से करने के लिए है?

क्या कोई प्रदर्शन लाभ है?

+0

अज्ञात आंतरिक वर्ग वाक्यविन्यास आपके लिए पर्याप्त वर्बोज़ नहीं है ?? –

उत्तर

3

गुमनाम आंतरिक वर्ग को आंतरिक वर्ग (जैसा कि प्रश्न उदाहरण कोड में) पर लाभ होता है, जिसमें यह विधि के स्थानीय चर से अधिक हो जाता है (हालांकि केवल final स्थानीय उपयोग योग्य हैं)।

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

(दॅ भी स्थानीय कक्षाएं, जो सामान्य नामित भीतरी एक विधि और स्थानीय लोगों के ऊपर है कि बंद के भीतर परिभाषित कक्षाओं कर रहे हैं।)

+0

क्या आप समझा सकते हैं कि "बंद हो गया" से आपका क्या मतलब है। धन्यवाद। – an00b

+0

@ an00b बहुत अच्छा नहीं है। यहां एक लिंक दिया गया है: http://en.wikipedia.org/wiki/Closure_(computer_programming) –

+0

वाह! बहुत बहुत धन्यवाद। आपने अभी अपना जवाब स्वीकार कर लिया है (कई अन्य उत्तरों के बावजूद भी बहुत अच्छा है)। अब मैं सीख रहा हूं कि प्रथम श्रेणी के कार्य क्या हैं, तो मैं सीखूंगा कि बंद क्या है। – an00b

1

लाभ वह समय है जब आप अतिरिक्त कीस्ट्रोक टाइप करने के लिए डेवलपर के रूप में सहेजते हैं। :)

ओह, और यह आपको सब कुछ के लिए एक नए नाम के साथ अनिवार्य रूप से आने से रोकता है (जो कुछ मामलों में नाम टकराव का कारण बन सकता है)।

+0

धन्यवाद। मैंने पहले ही अपने प्रश्न में कहा है "लाइनों की कम संख्या के अलावा", जिसमें "अतिरिक्त कीस्ट्रोक टाइप नहीं करना" शामिल है। :) नेमस्पेस विचार निश्चित रूप से एक अतिरिक्त लाभ है। – an00b

+0

@ an00b: हाँ, मुझे एहसास हुआ कि, लेकिन यह इतना महत्वपूर्ण लाभ है और वास्तव में कुछ अन्य फायदे हैं जो उल्लेखनीय थे। :) – Mehrdad

1

एक नुकसान यह है कि बाहर पॉप नहीं है:

आप एक ही भीतरी वर्ग के एक से अधिक की जरूरत है, तो आप काफी एक स्पष्ट रूप से परिभाषित वर्ग का उपयोग करने की जरूरत है। आप जो वर्णन करते हैं उसके लिए, आपको किसी की आवश्यकता नहीं है। लेकिन आप बाद की तारीख में निर्णय ले सकते हैं कि आपको एक और ऑब्जेक्ट की आवश्यकता है जो समान कार्यक्षमता करता है, लेकिन एक अलग वस्तु है।

2

गैर-अज्ञात का लाभ यह है कि आप कक्षा का पुन: उपयोग कर सकते हैं। मेरा मानना ​​है कि अज्ञात आंतरिक वर्ग का उपयोग करने का एकमात्र कारण ब्रेवटी है।

+2

इसके विपरीत, कभी-कभी आप स्रोत को यह स्पष्ट करना चाहते हैं कि कोड का दिया गया सामान्य उपयोग सामान्य उपयोग के लिए नहीं है, बल्कि केवल घोषणा के स्थल पर है। एक अज्ञात वर्ग यह करता है। –

+1

आप इसे 'निजी' आंतरिक कक्षा के साथ भी कर सकते हैं। –

2

चीजें मैं नामित इनर क्लासों बारे में पसंद:

  • वे एक नाम है। मुझे MyOuterClass$1 की बजाय स्टैक ट्रेस में दिखाई देने पर डीबग करना आसान लगता है, जो आपको अज्ञात आंतरिक कक्षा के साथ मिलता है।
  • यह कभी-कभी उस स्थान से आंतरिक कक्षा को वास्तविक कोड को अलग करने की पठनीयता को पढ़ने में मदद करता है। मुझे विशेष रूप से यह पसंद है अगर मैं पहले से ही एक लंबी विधि में हूं या एक या दो से अधिक इंडेंट किया गया हूं।

प्रदर्शन के बारे में आपके बिंदु पर टिप्पणी करने के लिए, अनाम आंतरिक कक्षाएं सामान्य कक्षाओं में संकलित हो जाती हैं, इसलिए कोई प्रदर्शन अंतर नहीं होना चाहिए।

0

गुमनाम वर्गों के उद्देश्य स्थानीय के रूप में अपने आवश्यक वर्ग बनाते हैं। बेनामी वर्गों का उपयोग तब किया जाता है जब हम बहुत निश्चित हैं कि एक विशेष श्रेणी ए कक्षा बी के लिए एकमात्र उपभोक्ता है और जहां कहीं भी इस बी वर्ग का उपयोग नहीं किया जा सकता है। फिर बेहतर हमने कक्षा बी को नामांकित कक्षा ए के अंदर अज्ञात वर्ग के रूप में परिभाषित किया। एक ही कक्षा के भीतर आवश्यक तर्क लिख रहे हैं ताकि बाहरी पक्ष से ऑब्जेक्ट के निर्माण से परहेज किया जा सके। कोड रखरखाव के मामले में इसे बनाए रखना आसान होगा।तो बेनामी वर्ग आपको अपना कोड अधिक संक्षिप्त बनाने में सक्षम बनाता है। वे आपको एक ही समय में एक कक्षा घोषित करने और तुरंत चालू करने में सक्षम बनाते हैं। वे स्थानीय वर्गों की तरह हैं सिवाय इसके कि उनके पास कोई नाम नहीं है। यदि आप केवल एक बार स्थानीय कक्षा का उपयोग करने की आवश्यकता है तो उनका उपयोग करें।

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