2010-11-05 14 views
9

मैंने हाल ही में एक एंड्रॉइड जावा ऐप में एक और मेनू आइटम जोड़ा है और यह अनुमान लगाया गया था कि ग्रहण ने कहा था कि पिछले मामले से चर: ब्रेक स्थानीय नहीं थे (इसलिए मैंने अभी तक एक प्रत्यय जोड़ा है)।बयान के मामले में चर क्यों स्थानीय नहीं हैं?

मैं अपने दिमाग में थोड़ा उलझन में हूं, मामले का पहला सेट: दूसरा विकल्प चुना गया था तो ब्रेक निष्पादित नहीं किया जाएगा। क्या कोई मेरी दोषपूर्ण सोच को समझा सकता है?

 case R.id.menuDebugMode: 
      debugMode = !debugMode; 
      if (debugMode){ 
       Toast.makeText(mainActivity.this, "Debug Mode on - NOT TO BE USED WHILST DRIVING", Toast.LENGTH_LONG).show();   
      } else { 
       tvDebug.setText(""); 
       tvInfo.setText(""); 
      } 
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putBoolean("debugMode", debugMode); 
      editor.commit(); 
     break; 

     case R.id.menuSpeedMode: 
      speedSignMode = !speedSignMode; 
      if (speedSignMode){ 
       Toast.makeText(mainActivity.this, "SpeedSign Mode in use", Toast.LENGTH_LONG).show();   

      } else { 
        Toast.makeText(mainActivity.this, "MapSpeed Mode in use", Toast.LENGTH_LONG).show();    
      } 
      SharedPreferences settings2 = getSharedPreferences(PREFS_NAME, 0); 
      SharedPreferences.Editor editor2 = settings2.edit(); 
      editor2.putBoolean("speedSignMode", speedSignMode); 
      editor2.commit(); 
     break;` 
+0

सभी त्वरित और उपयोगी उत्तरों के लिए धन्यवाद - मैंने टीएमई को स्वीकार किए गए एक के रूप में चिह्नित किया (क्योंकि यह क्यों स्पष्ट था :) लेकिन सभी जवाब अच्छे थे। मैं आमतौर पर अगर एक और प्रकार टाइप प्रोग्रामर हूं तो यही कारण है कि मुझे यहां पकड़ा गया है :) – SimpleSi

उत्तर

9

सी में, जावा में एक स्विच स्टेटमेंट ऐसा नहीं होता है जब कोई इसे देखेगा। इंडेंडेशन यह समझना मुश्किल बनाता है कि एक गुंजाइश नहीं बनाई गई है। यह सब सी तक उबाल जाता है, जहां एक स्विच सिर्फ वाक्य रचनात्मक चीनी है। कंपाइलर स्विच को कई सशर्त कूदों में बदल देता है। यह भाषा को फॉल-थ्रू का उपयोग करने में सक्षम बनाता है, एक विशेषता है कि सी के डिजाइन के दौरान ("ब्रेक" वैकल्पिक बना हुआ था)। यह जावा सुविधा सी

के लिए संगत बने रहे
switch(a): 
    case 1: 
     dosomething(); 
    case 2: 
     dosomemore(); 

if(a==1) jump ##1; 
if(a==2) jump ##2; 
jump ##3; 
##1: 
dosometing(); 
##2: 
dosomemore(); 
##3: 
12

आप सही हैं कि अधिकतर एक निष्पादित करेंगे, लेकिन एक मामला एक नया दायरा नहीं बनाता है। आप मैन्युअल रूप से अपने दायरे के साथ एक ब्लॉक बना सकते हैं।

case foo: 
    { 
     int var = ... 
    } 
    break; 

case bar: 
    { 
     int var = ... 
    } 
    break; 
+2

@ डेव, यह सिर्फ सादा गलत है। एक ब्रेक स्टेटमेंट अगले केस स्टेटमेंट के माध्यम से निष्पादन को रोकता है। – SimonC

3

मैथ्यू सही है - पूरे स्विच स्टेटमेंट में सीधे इसके भीतर घोषित किसी भी चर के लिए एक गुंजाइश है। आप मैथ्यू के उत्तर के अनुसार अधिक ब्रेसिज़ जोड़ सकते हैं - लेकिन यह निश्चित रूप से केस निकायों को विधियों के रूप में बाहर करने के लिए बेहतर होगा। ऐसा लगता है कि वे इस तरह "इनलाइन" शामिल करने के लिए बहुत कुछ कर रहे हैं।

ध्यान दें कि यहां स्कॉइंग नियम एंड्रॉइड के लिए विशिष्ट नहीं हैं - वे जावा के स्कोपिंग नियम हैं।

1

क्योंकि आपको वहां बहुत अधिक कोड/तर्क लिखना नहीं है - इन तरीकों को तोड़ दें।

4

दूसरों समझा दिया है आपको क्या करना चाहिए में अनुवाद किया जाता है, और है कि यह एक जावा भाषा बात है, नहीं एक Android विशिष्ट बात है।

क्यों जावा भाषा इस तरह परिभाषित किया गया है, मुझे पूरी तरह तार्किक कारण नहीं मिला है।

case foo: 
    int var = ... 
    // note drop through 
case bar: 
           int var = ... 
    var = var + 1; 
    break; 
कम से कम scoping की वर्तमान परिभाषा के साथ

, के सभी: सबसे अच्छा मैं के बारे में सोच सकते हैं कि अगर एक स्विच बयान के मामले सूचियों में से प्रत्येक परोक्ष एक गुंजाइश परिभाषित, फिर निम्न आसानी से पढ़ने में भूलना किया जा सकता है संभवतः भ्रमित उपयोग संकलन त्रुटियों में परिणाम।

(आईएमओ, स्विच स्टेटमेंट्स में केस ड्रॉप-थ्रू को छोड़ना बेहतर होगा ... जैसे सी # करता है। लेकिन डिजाइन गलतियों को हिंडसाइट में स्थानांतरित करना बहुत आसान होता है, और एक बार सही करने के लिए मुश्किल होती है।)

1

additon में अन्य उत्तर करने के लिए: यहाँ java language definition से व्याख्या दी गई है:

जब भी नियंत्रण के प्रवाह को एक ब्लॉक में प्रवेश करती है [...], एक नया वेरिएबल प्रत्येक स्थानीय चर के लिए बनाई गई है उस ब्लॉक के भीतर तुरंत एक स्थानीय परिवर्तनीय घोषणा विवरण में घोषित [...] स्थानीय चर effec ब्लॉक के निष्पादन के समय tively अस्तित्व में रहता है [...] पूर्ण है।

एक स्थानीय चरणीय क्षेत्र ब्लॉक ({ ... }) है, जिसमें आंतरिक ब्लॉक शामिल हैं। आपके कोड में वास्तविक ब्लॉक switch कथन के बाद शुरू होने वाला ब्लॉक है।

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