Java代码重构出现很复杂的if else嵌套,假设我们的业务需要支持所有国家的名字与简写的转换。
1、题目(代码重构)
在业务场景中,经常会出现很复杂的if else嵌套,假设我们的业务需要支持所有国家的名字与简写的转换,以目前的写法,会有上百个if else。
- 请在目前代码的基础上,试着优化写法,使得此段代码更好维护。
- 请以注释的形式写明重构优化的理由
2、代码片段
import java.util.HashMap;
/**
* Created by Q on 2022/3/27.
*/
public class CountryNameConverter {
// 请按你的实际需求修改参数
public String convertCountryName(String fullName) {
if ("china".equalsIgnoreCase(fullName)) {
return "CN";
} else if ("america".equalsIgnoreCase(fullName)) {
return "US";
} else if ("japan".equalsIgnoreCase(fullName)) {
return "JP";
} else if ("england".equalsIgnoreCase(fullName)) {
return "UK";
} else if ("france".equalsIgnoreCase(fullName)) {
return "FR";
} else if ("germany".equalsIgnoreCase(fullName)) {
return "DE";
} else {
throw new RuntimeException("unknown country");
}
}
}
3、重构代码
import java.util.HashMap;
public class CountryNameConverter {
// 请按你的实际需求修改参数
public String convertCountryName(String fullName) {
HashMap<String, String> Sites = new HashMap<String, String>();
// 实际大量数据时可以考虑其他初始化代码块中遍历添加键值对
Sites.put("china","CN");
Sites.put("america","US");
Sites.put("japan","JP");
Sites.put("england", "UK");
Sites.put("france", "FR");
Sites.put("germany", "DE");
return Sites.containsKey(fullName) ? Sites.get(fullName) : "unknown country" ;
}
public static void main(String[] args) {
CountryNameConverter cnc = new CountryNameConverter();
System.out.println(cnc.convertCountryName("china")); //CN
System.out.println(cnc.convertCountryName("ch")); //unknown country
}
}
4、扩展
HashMap判断键是否为 null 用containsKey(),而不用get():
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。
因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。