我已经开发了以下代码..
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 :(得分: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.