2010-08-27 7 views
6

विभिन्न केस निकायों को स्वचालित रूप से अपने दायरे में क्यों नहीं हैं? उदाहरण के लिए, यह करने के लिए अगर मैं थे:अलग-अलग केस कंडीशन बॉडी अलग-अलग दायरे में क्यों नहीं हैं?

switch(condition) { 
    case CONDITION_ONE: 
    int account = 27373; 
    case CONDITION_TWO: 
    // account var not needed here 
    case CONDITION_THREE: 
    // account var not needed here 
    case CONDITION_FOUR: 
    int account = 90384; 
} 

संकलक स्थानीय चर redefinitions के बारे में शिकायत करेंगे। मैं समझता हूँ कि मैं यह कर सकता है:

switch(condition) { 
    case CONDITION_ONE: { 
    int account = 27373; 
    } 
    case CONDITION_TWO: { 
    // account var not needed here 
    } 
    case CONDITION_THREE: { 
    // account var not needed here 
    } 
    case CONDITION_FOUR: { 
    int account = 90384; 
    } 
} 

बयानों के प्रत्येक सेट के चारों ओर एक ब्लॉक डाल करने के लिए अपने स्वयं के दायरे में प्रत्येक account चर डाल करने के लिए निष्पादित किया जाना है। लेकिन भाषा मेरे लिए ऐसा क्यों नहीं करती है?

आप कभी भी CONDITION_ONE के शरीर में स्थानीय चर घोषित करना चाहते हैं और फिर इसे CONDITION_TWO में उपयोग करें? यह एक गंभीर विचार की तरह लगता है जिसे स्पष्ट रूप से प्रतिबंधित नहीं किया जाना चाहिए, स्पष्ट रूप से अनुमति नहीं है।

+8

** क्योंकि [वह] (http: //en.wikipedia।संगठन/विकी/जेम्स_गोस्लिंग "जेम्स गोस्लिंग") ने कहा !! ** * (मेरा नया पसंदीदा उत्तर) * – jjnguy

+1

यह एक शापित अच्छा सवाल है; मुझे कल वही निराशा का सामना करना पड़ा। –

+1

अधिक स्पष्ट रूप से: आप कभी भी स्विच में स्थानीय चर घोषित क्यों करना चाहते हैं? उन्हें कम इस्तेमाल करें; एक मामले में नियंत्रण तर्क डालने एक भ्रमित कार्यक्रम के लिए एक नुस्खा है! –

उत्तर

5

यह शेष भाषा के साथ असंगत होगा।

जैसा कि है, ब्लॉक हमेशा ब्लॉक द्वारा निर्धारित किया गया है। उस तरह की स्थिरता जावा को पढ़ने और बनाए रखने में आसान बनाती है।

4

क्योंकि सी सी प्रोग्राम और जावा को सी प्रोग्रामर को लुभाने के लिए डिज़ाइन किया गया था।

+0

फिर सी इस तरह क्यों काम करता है? ;] –

+2

क्योंकि बेल लैब्स के यूनिक्स-लोगों को एक पोर्टेबल असेंबलर की आवश्यकता होती है, और ब्लॉक के बिना स्विच स्टेटमेंट उनके लक्षित मशीन कोड आउटपुट पर बहुत अच्छी तरह से मैप किए जाते हैं। –

6

आप क्यों चाहते हैं? यदि आपको प्रत्येक केस ब्लॉक के लिए एक नया दायरा चाहिए, तो आप अपने केस ब्लॉक में बहुत कुछ कर रहे हैं। एक विधि को बंद करो।

+1

अत्यधिक सहमत हैं, और यहां तक ​​कि अगर आप किसी भी मामले में * बहुत कुछ करना चाहते हैं, तो भी आपको अलग-अलग क्षेत्रों की आवश्यकता नहीं होगी। याद रखें कि पूरे कारण के दायरे का आविष्कार किया गया था, इसलिए एक ब्लॉक में 'खाता' दूसरे में 'खाता' से अलग है, जो कोई चिंता नहीं है जब स्कॉप्स कभी ओवरलैप नहीं होते हैं। –

1

आप के लिए पर्याप्त भाग्यशाली, तो आप इस व्यवहार पसंद नहीं में एक अच्छी कंपनी में हैं - Jon Skeet agrees with you :)

हाँ, मैं जानता हूँ कि लिंक सी के बारे में एक प्रश्न के है, लेकिन इस जावा व्यवहार सी से प्राप्त होती है ब्लॉक स्कोपिंग नियम।

2

अन्य उत्तरों को जोड़ने के लिए, आप गिरावट के लाभ भी खो देंगे, बाद के मामले को पिछले एक ही दायरे में होना चाहिए। जहां तक ​​मुझे पता है, भाषा से आप पर मजबूर होने से बचने के प्रयास से एक नए स्तर का दायरा जोड़ना बहुत आसान है।

2

मुझे खुशी है कि यह बिल्कुल ठीक है। local variable is always a block का दायरा। एक एकल नियम, कोई अपवाद नहीं।

एक ब्लॉक उन्हें उन्हें खोजने के लिए शासन करने के लिए सभी, एक ब्लॉक,
एक ब्लॉक और उन सब को लाने के लिए उन्हें बाँध अंधेरे में

+0

असल में मैं लिंकर्स को _light_ बनना पसंद करता हूं। –

0

वजह से, आप ऐसा करना चाहते हैं हो सकता है:

switch(condition) { 
    case CONDITION_ONE: 
    int account = 27373; 
    case CONDITION_TWO: 
    DoStuffHere(); 
    case CONDITION_THREE: 
    case CONDITION_FOUR: 
    DoMoreStuffHere(); 
} 

तब, और इसके साथ ... यदि आपको "CONDITION_ONE" मिल गया है, तो चर सेट किया जाएगा, और DoStuffHere और DoMoreStuffHere दोनों को बुलाया जाएगा। लेकिन, अगर अन्यथा आपको CONDITION_THREE मिल गया है, तो केवल DoMoreStuffHere को कॉल किया जाएगा।

+2

स्कॉइंग करने के लिए यह वास्तव में कितना प्रासंगिक है? –

+0

ठीक है, वह किसी भी "मामलों" में "खाता" का उपयोग कर सकता है। – Tejo

0

उत्तर जैसा कि अन्य ने कहा है - अधिक या कम - क्योंकि चीजें काम करती हैं।

शायद टॉम ट्रेस्नस्की वास्तव में वांछित प्रभाव को प्राप्त करने का मतलब था।

switch(condition) { 
    case CONDITION_ONE: 
    { int account = 27373; } 
    case CONDITION_TWO: 
    // account var not needed here 
    case CONDITION_THREE: 
    // account var not needed here 
    case CONDITION_FOUR: 
    { int account = 90384; } 
} 
संबंधित मुद्दे