正文
二、消除if...else的锦囊妙计
6、其他的消除if...else的方法
当然实际项目开发中使用if...else判断的场景非常多,上面只是其中几种场景。下面再列举一下,其他常见的场景。
1.根据不同的数字返回不同的字符串
public String getMessage(int code) { if (code == 1) { return"成功"; } elseif (code == -1) { return"失败"; } elseif (code == -2) { return"网络超时"; } elseif (code == -3) { return"参数错误"; } thrownew RuntimeException("code错误"); }
其实,这种判断没有必要,用一个枚举就可以搞定。
publicenum MessageEnum { SUCCESS(1, "成功"), FAIL(-1, "失败"), TIME_OUT(-2, "网络超时"), PARAM_ERROR(-3, "参数错误"); privateint code; private String message; MessageEnum(int code, String message) { this.code = code; this.message = message; } public int getCode() { returnthis.code; } public String getMessage() { returnthis.message; } public static MessageEnum getMessageEnum(int code) { return Arrays.stream(MessageEnum.values()).filter(x -> x.code == code).findFirst().orElse(null); } }
再把调用方法稍微调整一下
public String getMessage(int code) { MessageEnum messageEnum = MessageEnum.getMessageEnum(code); return messageEnum.getMessage(); }
完美。
2.集合中的判断
上面的枚举MessageEnum中的getMessageEnum方法,如果不用java8的语法的话,可能要这样写
public static MessageEnum getMessageEnum(int code) { for (MessageEnum messageEnum : MessageEnum.values()) { if (code == messageEnum.code) { return messageEnum; } } returnnull; }
对于集合中过滤数据,或者查找方法,java8有更简单的方法消除if...else判断。
public static MessageEnum getMessageEnum(int code) { return Arrays.stream(MessageEnum.values()).filter(x -> x.code == code).findFirst().orElse(null); }
3.简单的判断
其实有些简单的if...else完全没有必要写,可以用三目运算符代替,比如这种情况:
public String getMessage2(int code) { if(code == 1) { return"成功"; } return"失败"; }
改成三目运算符:
public String getMessage2(int code) { return code == 1 ? "成功" : "失败"; }
修改之后代码更简洁一些。
4.spring中的判断
对于参数的异常,越早被发现越好,在spring中提供了Assert
用来帮助我们检测参数是否有效。
public void save(Integer code,String name) { if(code == null) { throw Exception("code不能为空"); } else { if(name == null) { throw Exception("name不能为空"); } else { System.out.println("doSave"); } } }
如果参数非常多的话,if...else语句会很长,这时如果改成使用Assert
类判断,代码会简化很多:
public String save2(Integer code,String name) { Assert.notNull(code,"code不能为空"); Assert.notNull(name,"name不能为空"); System.out.println("doSave"); }
当然,还有很多其他的场景可以优化if...else,我再这里就不一一介绍了,感兴趣的朋友可以给我留言,一起探讨和研究一下。