【问题标题】:What can be used instead of If-else statement in this code? [closed]在这段代码中可以使用什么来代替 If-else 语句? [关闭]
【发布时间】:2016-08-02 10:49:44
【问题描述】:
public static Currency getByCurrencyCode(String pCurrencyCode){
if (CURRENCY_CODE_USD.equalsIgnoreCase(pCurrencyCode)){
return US_DOLLAR;
}
if (CURRENCY_CODE_HKD.equalsIgnoreCase(pCurrencyCode)){
return HK_DOLLAR;
}
if (CURRENCY_CODE_MYR.equalsIgnoreCase(pCurrencyCode)){
return MALAYSIAN_RINGGIT;
}
return null;
}
【问题讨论】:
标签:
java
loops
if-statement
conditional
【解决方案1】:
您可以填充Map<String, Currency> 并根据名称返回Currency(并使名称始终为大写或小写)。类似的,
private static Map<String, Currency> map = new HashMap<>();
static {
map.put(CURRENCY_CODE_USD.toLowerCase(), US_DOLLAR);
map.put(CURRENCY_CODE_HKD.toLowerCase(), HK_DOLLAR);
map.put(CURRENCY_CODE_MYR.toLowerCase(), MALAYSIAN_RINGGIT);
}
public static Currency getByCurrencyCode(String pCurrencyCode) {
return map.get(pCurrencyCode.toLowerCase());
}
【解决方案2】:
为什么不使用地图来保存这些currency_code->currency?如果使用,您可以简单地使用 CurrencyMap.get(currency_code) 来替换所有这些 if-else。
【解决方案3】:
您可以使用多种替代方法。一个是switch 声明:
public static Currency getByCurrencyCode(String pCurrencyCode) {
switch (pCurrencyCode.toLowerCase()) {
case CURRENCY_CODE_USD:
return US_DOLLAR;
case CURRENCY_CODE_HKD:
return HK_DOLLAR;
case CURRENCY_CODE_MYR:
return MALAYSIAN_RINGGIT;
default:
return null;
}
}
但是,这要求各种CURRENCY_* 变量是编译时String 常量,并且pCurrencyCode 不能是null。我假设CURRENCY_* 变量都是小写的,但如果它们是大写的,就用pCurrencyCode.toUpperCase() 代替。
另一种方法是定义一个从String 到Currency 对象的映射并直接查找答案:
private static Map<String, Currency> sCurrencyMap;
static {
sCurrencyMap = new HashMap<>();
sCurrencyMap.put(CURRENCY_CODE_USD, US_DOLLAR);
sCurrencyMap.put(CURRENCY_CODE_HKD, HK_DOLLAR);
sCurrencyMap.put(CURRENCY_CODE_MYR, MALAYSIAN_RINGGIT);
}
public static Currency getByCurrencyCode(String pCurrencyCode) {
return sCurrencyMap.get(pCurrencyCode.toLowerCase());
}