不要这样做。如果你必须这样做,你可以这样做:
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.