-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 ;
4

2 回答 2

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);

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

于 2012-04-23T15:57:58.523 回答
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 的代码至少是精简的。

我看到您是 switch 语句的新手。所以我稍微详细说明一下。

如果您的输入是整数形式(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 也可以切换字符串,但在此之前,您只能切换整数类型,并且大小写标签必须在编译时保持字面上的常量和已知。

在 OOP 中,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. 
于 2012-04-23T16:06:32.477 回答