关于Switch条件语句

时间:2012-04-23 15:50:29

标签: java

我已经开发了以下代码..

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 ;

2 个答案:

答案 0 :(得分:5)

Switch不会帮助你,但条件表达式可以:

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

我强烈建议反对抓住Exception,顺便说一下。如果必须,请捕获特定的异常类型 - 尽管在这种情况下我至少会在返回之前记录错误。

编辑:至于第二段代码,看起来你只是想要:

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

虽然当determineCardType(input)返回true时isDRCard(input)为什么会返回DR_CARD_TYPE以外的东西,但这是个谜......

答案 1 :(得分: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作为字节返回,因此您可以在设置类型后稍后切换。此代码比您的代码更难阅读。 Jons代码至少是精益的。

我看到你是切换语句的新手。所以我详细说明一下。

如果您的输入是积分形式(int,byte,short,Enum),并且您可以将其与 - 大多数中等短值列表匹配,则switch语句很有用。

如果你否则会使用一系列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也可以切换字符串,但在此之前,您只能切换整数类型,并且case标签必须在字面上保持不变并且在编译时已知。

在OOP中,切换语句经常被放弃,转而支持动态调度。

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.