やらないでください。それをしなければならない場合は、次のようにすることができます。
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 を byte として返すため、タイプを設定した後で切り替えることができます。このコードは、あなたのコードよりも読みにくいです。Jons コードは少なくともリーンです。
ステートメントを切り替えるのは初めてだと思います。というわけで少し詳しく。
switch ステートメントは、入力が整数形式 (int、byte、short、Enum) であり、値のほとんどが中程度の短いリストと照合できる場合に便利です。
それ以外の場合は、一連の if/else ステートメントを使用します。Case ステートメントは相互に排他的である必要はありませんが、ほとんどの場合は排他的です。
あなたの場合、ブール値を返す 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.