2012-04-23 3 views
-3

У меня есть ниже фрагмент кода, который я разработал ..Что касается переключателя условного оператора

public byte determineCardType(final IInput inputData) { 
    byte cardType = UNKNOWN_CARD; 
    try { 
     if (isWagRewardsLoyaltyCard(inputData)) 
      cardType = WAG_LOYALTY_CARD_TYPE; 
     else if (isDRCard(inputData)) //checking that card scanned and swiped is a DR Card 
      cardType = DR_CARD_TYPE;  
     else if (isWagRewardsPartnerCard(inputData)) 
      cardType = AARP_CARD_TYPE; 
     return cardType; 
    } catch (Exception e) { 
     return UNKNOWN_CARD; 
    } 
} 

пожалуйста, сообщите мне можно выше код можно регулировать в цикле переключения, если да, то пожалуйста, сообщите, спасибо заранее ,

другой код, который связан с ним ...

if((aarpCardSupport.isAARPCard(input))||(determineCardType(input)==DR_CARD_TYPE)) { 
    return true; 
} else if((isDRCard(input))&&(isDRLoayltyEnabled())) { //would return 1 for DR card only when isDRLoayltyEnabled returns true 
    return true; 
}  
return false ; 
+0

Ваш учитель попросил вас переключиться на «переключатель»? ;) – adarshr

+0

Вы должны указать код ваших методов 'is * Card'. – Sirko

+0

если ((aarpCardSupport.isAARPCard (ввод)) || (defineCardType (ввод) == DR_CARD_TYPE)) { return true; } else if ((isDRCard (input)) && (isDRLoayltyEnabled())) // возвращает 1 для карты DR только тогда, когда isDRLoayltyEnabled возвращает true { return true; } return false; } – dghtr

ответ

5

коммутатор не поможет, но условные выражения могут:

return isWagRewardsLoyaltyCard(inputData) ? WAG_LOYALTY_CARD_TYPE 
    : isDRCard(inputData) ? DR_CARD_TYPE 
    : isWagRewardsPartnerCard(inputData) ? AARP_CARD_TYPE 
    : UNKNOWN_CARD; 

Я бы настоятельно рекомендовал против ловли Exception , кстати. Catch специфические типы исключений, если вы должны - хотя в этом случае я бы хотя бы зарегистрировал ошибку перед возвратом.

EDIT: Что касается второй части кода, это выглядит, как вы просто хотите:

return aarpCardSupport.isAARPCard(input) 
    || determineCardType(input) == DR_CARD_TYPE 
    || (isDRCard(input) && isDRLoayltyEnabled); 

Хотя почему determineCardType(input) возвращает что-то другое, чем DR_CARD_TYPE когда isDRCard(input) возвращает истину является тайной ...

+0

.. удивительный чувак, выраженное условие в форме тройного оператора, очень заметное, большое спасибо, поэтому, пожалуйста, сообщите, что приведенный выше код может быть выражен как .public byte defineCardType (final IInput inputData) { byte cardType = UNKNOWN_CARD; try { возвращение -WagRewardsLoyaltyCard (inputData)? WAG_LOYALTY_CARD_TYPE : isDRCard (inputData)? DR_CARD_TYPE : isWagRewardsPartnerCard (inputData)? AARP_CARD_TYPE : UNKNOWN_CARD; catch (исключение e) { возвращение UNKNOWN_CARD; } } } – dghtr

+0

+1, за рекомендацию против ловли 'Исключение'. – Makoto

+0

@ user1344709: Отредактировано в соответствии с кодом в вашем вопросе. Непонятно, почему вы оставили в комментариях еще больше кода, но в принципе он не читается. –

1

Не делайте этого. Если вы должны сделать это, вы могли бы сделать это следующим образом:

public byte determineCardType (final IInput inputData) { 
    byte cardType = UNKNOWN_CARD; 
    try { 
     switch (isWagRewardsLoyaltyCard (inputData) ? 1 : 
     (isDRCard (inputData) ? 2 : (isWagRewardsPartnerCard (inputData) ? 3 : 4))) 
     { 
      case 1: cardType = WAG_LOYALTY_CARD_TYPE; break; 
      case 2: cardType = DR_CARD_TYPE; break; 
      case 3: cardType = AARP_CARD_TYPE; break; 
      default: // UNKNOWN_CARD already default 
     } 
     return cardType; 
    } catch (CardException ce) { 
     return UNKNOWN_CARD; 
    } 
    } 
} 

Но так как вы возвращаете cardType, как байты, вы можете переключаться позже, после установки типа. Этот код сложнее читать, чем ваш код. Код Джонса, по крайней мере, худой.

Я вижу, что вы новичок в переключении утверждений. Поэтому я немного разбираюсь.

Оператор switch полезен, если ваш вход находится в интегральной форме (int, byte, short, Enum), и если вы можете сопоставить его с главным средним коротким списком значений.

И если вы иначе использовали бы последовательность операторов if/else. Заявления о случаях не обязательно должны быть взаимными, но чаще всего они есть.

В вашем случае вы вызываете 3 метода, которые возвращают логические значения, поэтому вход не является неотъемлемым. Но ваш результат.

Позже в коде, вы можете написать:

 byte cardType = determineCardType (inputDate); 
     switch (cardType) 
     { 
      case WAG_LOYALTY_CARD_TYPE: doWlct (foo, bar); break; 
      case DR_CARD_TYPE: doDct(); break; 
      case AARP_CARD_TYPE: doAct (baz); foobar(); break; 
      case UNKNOWN_CARD: System.err.println ("Unknown card"); 
     } 

Иначе вы бы написать:

 if (cardType == WAG_LOYALTY_CARD_TYPE) 
      doWlct (foo, bar); 
     else if (cardType == DR_CARD_TYPE) 
      doDct(); 
     else if (cardType == AARP_CARD_TYPE) { 
      doAct (baz); 
      foobar(); 
     } 
     else ... 

Поскольку Java 1.7 Переключающие Струны можно также, но до тех пор, вам могут переключаться только на интегральные типы, а метки меток должны быть буквально постоянными и известны во время компиляции.

В ООП операторы switch часто оставляются в пользу динамической отправки.

interface Card { 
    public abstract int authenticate(); 
} 

class WagLoyalityCard implements Card { 
    public int authenticate() { 
     doWlct (foo, bar); 
    } 
} 

class DrCard implements Card { 
    public int authenticate() { 
     doDct(); 
    } 
} 

// ... and so on 

Card card = new DrCard(); 
// authenticate: 
card.authenticate(); 

// depending on the card type, DrCard.authenticate() or 
// WagCard.authenticate() gets called. 
+0

Большое спасибо, так что это также будет работать, спасибо большое – dghtr

+0

@ userunknown..please advise Но так как вы возвращаете cardType в качестве байта, вы можете переключиться позже, установив тип .. в каком контексте вы говорили, cann; t схватить. – dghtr

+0

@ user1344709: Попробовал объяснить это лучше. –

Смежные вопросы