2010-04-14 8 views
19

उदाहरण के लिए और यह कानूनी है:जावा में विधियों को घोंसला दिया जा सकता है और इसका क्या प्रभाव है?

class NAME { 
method { 
    method {} 
} 
} 

और प्रभाव क्या होगा? क्या कोई विशेष वाक्यविन्यास शामिल है?

+2

अवैध सामान कॉल करने के लिए नहीं है! मैं नकारात्मक मतदान का जोखिम उठा रहा हूं: आप क्या देख रहे हैं? बस एसओ वोट? इस सवाल के बारे में क्या है? आप क्या हासिल करने का प्रयास कर रहे हैं? –

+4

@EJP, कंपाइलर केवल मुझे सही जवाब देगा यदि संकलक उत्तर हाँ है। मैं कोशिश कर सकता था और यह काम नहीं कर सका लेकिन वाक्यविन्यास गलत हो सकता है, मैं गलती से हो सकता था। जानने का कोई तरीका नहीं है। – David

+3

मुझे खेद है, लेकिन यह एक अर्थहीन quibble है। आपने पूछा कि क्या यह कानूनी है। संकलक जवाब देता है कि या तो नकारात्मक या सकारात्मक में। – EJP

उत्तर

38

अद्यतन के बाद से जावा 8 तरीकों lambdas का उपयोग कर नेस्ट किया जा सकता है, this other question देखते हैं।

इस उत्तर पूर्व जावा से 8 जावा संस्करणों के लिए मान्य है

मूल जवाब अनुवर्ती:

जावा में तरीकों नेस्ट किया जा सकता है [...]?

नहीं, यह संभव नहीं है।

निकटतम बात आप प्राप्त कर सकते है:

class Name { 
    void methodOne() { 
     class InnerClass { 
      void methodTwo() { 
      } 
     } 
    } 
} 

यही है, एक दूसरी विधि एक आंतरिक वर्ग एक विधि में परिभाषित में परिभाषित किया।

आप विधि भीतरी वर्ग के भीतर स्थिर घोषणा कर सकते हैं, तो आप new

+0

आपको आंतरिक कक्षा घोषणा पर ब्रांड्स को हटाना होगा: 'कक्षा इनर क्लास {' – Mindwin

+2

हां यह पुराना और बंद है लेकिन पाठकों के लिए, आप स्थिर सदस्यों को आंतरिक कक्षा में घोषित नहीं कर सकते क्योंकि उन्हें एक उदाहरण की आवश्यकता है बाहरी वर्ग आप नए ऑपरेटर से नहीं बच सकते हैं। – 1der

+0

जावा 8 इसके लिए एक अच्छा वाक्यविन्यास चीनी प्रदान करता है। http://stackoverflow.com/a/28576581/354144 –

12

यह अमान्य वाक्यविन्यास है; ऐसी कोई सुविधा समर्थित नहीं है। (हालांकि इसे जावा 7 के लिए माना जा रहा है)

इसके बजाय, आप नेस्टेड कक्षाओं का उपयोग कर सकते हैं, जो आप just asked about हैं।

+0

विशेष रूप से स्थानीय आंतरिक कक्षाएं। –

+0

जावा 7 पहले से ही बाहर है और इसमें नेस्टेड विधियां शामिल नहीं हैं। शायद जावा 8. – mirelon

+0

जावा 8 पहले से ही बाहर है और इसमें नेस्टेड विधियां शामिल नहीं हैं। शायद जावा 9. – Oli

2

जांच किए बिना, मैं कहूंगा कि यह संकलक द्वारा स्वीकार नहीं किया गया है क्योंकि इस समय विधियों को कक्षा के भीतर परिभाषित करने की आवश्यकता है। हालांकि, आप विधि के अंदर एक आंतरिक कक्षा को परिभाषित कर सकते हैं (देखें "स्थानीय और बेनामी आंतरिक कक्षाएं")।

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

4

सं

एक समाधान सिर्फ तरीकों आप "जनक" बाहर method-- यदि आप वास्तव में परेशान कर रहे थे, तो आप कुछ नामकरण परंपरा इस्तेमाल कर सकते हैं निजी तरीके के रूप में कॉल करना चाहते घोषित करने के लिए है यह इंगित करने के लिए कि वे "मूल" विधि से "संबंधित" हैं।

एक और चीज जिसे आप विचार कर सकते हैं - और प्रोग्रामर के बीच व्यापक रूप से ज्ञात नहीं दिखता है - यह है कि आप किसी भी मनमाने ढंग से स्कोप ब्लॉक घोषित कर सकते हैं और लेबल कर सकते हैं, फिर उस ब्लॉक को तोड़ने के लिए ब्रेक का उपयोग करें।

void method() { 
     myInnerMethod : { 
     // do some stuff 

     if (condition) { 
      break myInnerMethod; 
     } 

     // do some more stuff 
     } 
} 
बेशक

, गुंजाइश ब्लॉक वास्तव में एक तरीका नहीं है, लेकिन कुछ मामलों में, यह आप चाहते हैं क्या एक "आंतरिक करने के लिए इस्तेमाल किया जा सकता:

तो निम्नलिखित पूरी तरह से कानूनी जावा है विधि "के लिए।

+0

+1, मुझे यह कभी नहीं पता था, लेकिन मैंने अभी इसे सत्यापित किया है ...मुझे लगता है कि आप ब्लॉक को कॉल नहीं कर सकते हैं, लेकिन ऊपर बताए गए अनुसार आप इसे कूद सकते हैं। (वास्तव में यह सुनिश्चित नहीं है कि इस सुविधा का उपयोग क्या है, टीबीएच।) – Edmund

+0

@ एडमंड आप ** ** लेबल वाले ब्लॉक तक नहीं जा सकते हैं। आप ** ** ** केवल ** से बाहर तोड़ सकते हैं। जो उन्हें ersatz विधियों के रूप में बेकार के बगल में बनाता है। –

+0

@ स्टीफन - सुधार के लिए धन्यवाद। मैंने लेबल किए गए ब्रेक का कभी भी उपयोग नहीं किया है और माना जाता है कि उनका मतलब है कि "इस लेबल को तोड़ें" और "इस लेबल से बाहर नहीं निकलें"। – Edmund

-2

जावा में स्वीकार नहीं किया गया। ऐसा लगता है कि आप रिकर्सन करना चाहते हैं, बस उसी विधि को फिर से कॉल करें।

method(){ 

    method(); 

} 
+0

सोचें कि उनका मतलब शाब्दिक रूप से एक विधि को परिभाषित करना है, रिकर्सन नहीं। –

+1

@Neil: मुझे नहीं लगता कि वह जानता है कि उसका क्या मतलब है। ;) हालांकि, आप शायद सही हैं। – SLaks

3

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

आप नेस्टेड कक्षाओं का उपयोग कर सकते हैं, लेकिन वे कीमत पर आते हैं। प्रत्येक घोंसला वर्ग एक $ नामित वर्ग उत्पन्न करता है। प्रत्येक में खुली फ़ाइल हैंडल (यदि संग्रह से नहीं खींचा जाता है) के मामले में एक टोल है, साथ ही इसकी कक्षा परिभाषा द्वारा लिया गया स्मृति भी है। कुछ प्रणालियों में फाइलों की संख्या (इस प्रकार कुल जेनरेटेड क्लास) पर कैप होता है, जिसे वे तैनात कर सकते हैं (उदाहरण के लिए Google Apps।)

दूसरे शब्दों में, मैं नेस्टेड विधियों की नकल करने के लिए नेस्टेड कक्षाओं का उपयोग नहीं करता (बस अगर आप कि कोशिश करने का फैसला।)

अब, यह आप नेस्टेड तरीकों का उपयोग कर सकता है (एडीए में के रूप में कल्पना करते हुए), उन तरीकों केवल संलग्नित विधि के भीतर दिखाई दे रहा होगा (वे ठेठ निजी तरीकों की तुलना में अधिक सीमित होगी।) वे बाहरी दायरे में परिभाषित चर और पैरामीटर देख पाएंगे (लेकिन संभवतः केवल अंतिम के रूप में परिभाषित किए गए हैं।)

यह आपको अपने मीटर को व्यवस्थित करने की अनुमति देगा नेस्टेड नेमस्पेस में विधि और एल्गोरिदम। बुद्धिमानी से उपयोग किए जाने पर, नेस्टेड विधियां वास्तव में आपके कोड को व्यवस्थित करने में सहायता करती हैं।

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