2013-07-12 4 views
5

मैं इसे पढ़ने में आसान बनाने के लिए कुछ कोड रीफैक्टर कर रहा था और मैं उस चीज़ में भाग गया जो मुझे अजीब लगता है और मैं सोच रहा था कि कोई मुझे यह समझा सकता है।विभिन्न स्विच मामलों में चर के समान नाम नहीं हो सकता है?

मूल कोड:

if(tokensLeft == 3) { 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
} else if(tokensLeft == 2) { 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
} else { 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
} 

पुनर्रचना के बाद:

switch(tokensLeft) { 
case 3: 
    String id = tokens.nextToken(); 
    String value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
    break; 
case 2: 
    String id = tokens.nextToken(); // Syntax error 
    String value = tokens.nextToken(); // Syntax error 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
    break; 
default: 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    break; 
} 

पहली नज़र में यह पूरी तरह से उचित है, लेकिन यह मेरे एक सिंटैक्स त्रुटि देता है।

लिंक एक स्थानीय नाम परिवर्तन के लिए सभी संदर्भों (अन्य फ़ाइलों में संदर्भ परिवर्तन नहीं करता है)

ऐसा लगता है कि एक स्विच बयान में किसी कारण से, मैं फिर से String id और String value का उपयोग करने में असमर्थ हूँ एक अलग मामले में।

यह मेरे चर के बजाय अजीब नामकरण करता है।

अब आप कह सकते हैं: "बस अपने स्विच स्टेटमेंट के ऊपर अपने चर घोषित करें।" लेकिन इसका मतलब यह होगा कि मैं हमेशा मेरे चर बनाते हैं, भले ही tokensLeft न तो 3 या 2 है और मुझे अपने चर की आवश्यकता नहीं होगी। यह अनावश्यक स्मृति का उपयोग करने जैसा लगता है।

क्या कोई मुझे बता सकता है कि स्विच केस ऐसा क्यों करता है और मैं अपनी समस्या का समाधान कैसे कर सकता हूं?

+2

उपयोग के तरीकों - यह अच्छा अभ्यास वैसे भी और अपने दायरे आप के लिए हल हो जाएगा। यदि आप वास्तव में स्पेगेटी कोड लिखना चाहते हैं तो स्पष्ट ब्लॉक ('{}') का उपयोग करें। –

उत्तर

1

चर को घोषित करने के बारे में कैसे?

switch (tokensLeft) { 
    case 3: 
     rawListener.binaryInfo(
       tokens.nextToken(), 
       parseInt(tokens.nextToken()), 
       tokens.nextToken(), 
       this); 
     break; 
    case 2: 
     rawListener.binaryInfo(
       tokens.nextToken(), 
       parseInt(tokens.nextToken()), 
       this); 
     break; 
    default: 
     throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
} 

मैं Integer.parseInt के लिए एक static आयात गयी।

अभी तक बेहतर switch से अच्छी तरह से नामित तरीकों में अपने तर्क फोन और घोषित जो कुछ चर आप चाहते हैं:

public void parseTokens() { 
    switch (tokensLeft) { 
     case 3: 
      parseThreeTokens(rawListener, tokens); 
      break; 
     case 2: 
      parseTwoTokens(rawListener, tokens); 
      break; 
     default: 
      throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    } 
} 

public void parseThreeTokens(final RawListener rawListener, final Tokens tokens) { 
    final String id = tokens.nextToken(); 
    final String value = tokens.nextToken(); 
    final String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, parseInt(value), trailerId, this); 

} 

public void parseTwoTokens(final RawListener rawListener, final Tokens tokens) { 
    final String id = tokens.nextToken(); 
    final String value = tokens.nextToken(); 
    rawListener.binaryInfo(id, parseInt(value), this); 
} 
+2

मुझे लगता है कि यह काम करेगा, लेकिन ऐसा लगता है कि जब मेरा मूल लक्ष्य इसे आसान बनाना है तो चीजों को पढ़ने में आसान लगता है। – JREN

+0

उस मामले में विधियां बनाएं। आपका कोड पढ़ने में आसान नहीं है - सर्वोत्तम अभ्यास (और चाचा बॉब) सुझाव देता है कि विधियां 10 लाइनों से अधिक लंबी नहीं होनी चाहिए। यह स्विच ब्लॉक पहले से ही लगभग 20 है। –

+0

क्या आपके पास कोई सुझाव है कि मैं 2 तरीकों के बीच अंतर कैसे कर सकता हूं क्योंकि केवल एक ही अंतर यह है कि उनमें से एक तीसरा पैरामीटर का उपयोग करेगा। इसके अलावा, वे समान हैं। और विधियां केवल 1 पैरामीटर 'टोकन' स्वीकार करेंगी। – JREN

3

String id; 
    String value ; 

    switch(tokensLeft) { 
    case 3: 
    id = tokens.nextToken(); 
    value = tokens.nextToken(); 
    String trailerId = tokens.nextToken(); 
    rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
    break; 
    case 2: 
    id = tokens.nextToken(); // Syntax error 
    value = tokens.nextToken(); // Syntax error 
    rawListener.binaryInfo(id, Integer.parseInt(value), this); 
    break; 
    default: 
    System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
    break; 
    } 

यहाँ यह स्मृति समस्याओं का कारण नहीं होगा, जैसा कि आप कहते हैं कि नीचे के रूप में यह मत करो। जब यह विधि निष्पादित करता है तो यह स्टैक में आईडी और मान रखेगा और उन संदर्भों के लिए ढेर में कोई प्रासंगिक वस्तु नहीं होगी। इस प्रकार मेमोरी के साथ कोई समस्या नहीं है, बल्कि दो रेफरी के लिए छोटी मेमोरी लेती है।

+1

कृपया मेरे कोड के नीचे जो मैंने कहा है उसे पढ़ें ... – JREN

8

आप वैरिएबल को फिर से परिभाषित कर रहे हैं, जो डुप्लिकेट वेरिएबल घोषणा है। case कोई ब्लॉक नहीं बनाता है।

JLS 14 के अनुसार:

एक ब्लॉक बयान, स्थानीय वर्ग घोषणाओं और ब्रेसिज़ के भीतर स्थानीय चर घोषणा बयान के एक दृश्य है। हालांकि यह बहुत अजीब मुझे कहना पड़ेगा लग रहा है,

  1. { .. } का उपयोग कर प्रत्येक मामले के तहत एक स्पष्ट ब्लॉक परिभाषित करें:

आप यहाँ दो विकल्प हैं।

या

  • प्रत्येक case में आप एक विधि कॉल करने के लिए तर्क प्रतिनिधि कर सकते हैं।

  • +0

    लेकिन यह मेरी समस्या को ठीक करने में मेरी सहायता कैसे करता है? – JREN

    +3

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

    +0

    ठीक है, हाँ, मैं इसे अब देखता हूं कि आपने अपना जवाब संपादित कर लिया है: पी – JREN

    6

    जोड़ें {}। इस प्रयास करें:

    switch(tokensLeft) { 
    case 3: 
    { 
        String id = tokens.nextToken(); 
        String value = tokens.nextToken(); 
        String trailerId = tokens.nextToken(); 
        rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); 
    } 
        break; 
    case 2: 
    { 
        String id = tokens.nextToken(); // Syntax error 
        String value = tokens.nextToken(); // Syntax error 
        rawListener.binaryInfo(id, Integer.parseInt(value), this); 
    } 
        break; 
    default: 
        System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); 
        break; 
    } 
    
    +0

    सुंदर चालाक। यह सही जवाब होना चाहिए। यह एकाधिक स्विच मामलों में समान चर नाम का उपयोग करने के लिए ओप का लक्ष्य प्राप्त करता है। – Thupten

    2

    आप मामले के बाद कर्ली कोष्ठक {} का उपयोग कर सकते हैं:

    int aInt = 3; 
    switch (aInt) { 
        case 0: { 
        String text = ""; 
        break; 
        } 
        case 1: { 
        String text = ""; 
        break; 
        } 
    } 
    
    0

    caseswitch बयान में blocks नहीं हैं; इसलिए, एक ही चर को कई स्विच मामलों में घोषित करके, आप चर को फिर से परिभाषित करने का प्रयास कर रहे हैं। यह if कथन में काम करता है क्योंकि वे blocks बनाते हैं।

    या तो स्विच से पहले उन्हें घोषित करें, या अपने मामलों में ब्लॉक डालें।

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