shigen
坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen
在文章的开头我们先从这些场景进入本期的问题:
可能文字描述还是略显抽象,我们直接上代码:
public class SimplifyIfElse {
public String handleQuestion(String type, String detail) {
if ("A".equals(type)) {
return "call methodA to handle" + detail;
} else if ("B".equals(type)) {
return "call methodB to handle" + detail;
} else if ("C".equals(type)) {
return "call methodC to handle" + detail;
} else {
throw new IllegalArgumentException("invalid type: " + type);
}
}
}
这种代码其实很常见的,使用起来也就是一行调用:
public static void main(String[] args) {
assert new SimplifyIfElse().handleQuestion("B", "detail").equals("call methodB to handledetail");
}
这里直接用的
assert
进行的断言验证。
但是有没有考虑到一些问题:
也许稍微有点经验的同学会想到我用策略模式、工厂方法等等来优化一下这段代码。可以,至少会设计模式的基本使用了,但是对于这样同类型的问题,我们没有必要整的这么复杂。
不管是策略模式还是工厂方法,其底层还是维护的一个hashMap,对应的key和value分别是问题标识和问题的解决方法。
掌握到这个核心,我们来优化下现存的代码:
private static final HashMap<String, Function<String, String>> QUESTION_HANDLER_MAP = new HashMap<>();
static {
QUESTION_HANDLER_MAP.put("A", detail -> "call methodA to handle" + detail);
QUESTION_HANDLER_MAP.put("B", detail -> "call methodB to handle" + detail);
QUESTION_HANDLER_MAP.put("C", detail -> "call methodC to handle" + detail);
}
public String handleQuestionV2(String type, String detail) {
return Optional.ofNullable(QUESTION_HANDLER_MAP.get(type).apply(detail)).orElseThrow(() -> new IllegalArgumentException("invalid type: " + type));
}
这里用到了java8的新特性,Function和Optional,其中:
代码这样改造之后,后期只需要往QUESTION_HANDLER_MAP
增添新的元素即可,大大的简化了代码。
当然常见的消除if-else代码的方式还有:
这里先在此点一下,有时间继续分享。附:代码截图:
与shigen一起,每天不一样!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。