6、使用 Optional
从 JDK 1.8 开始引入 Optional 类,在 JDK 9 时对 Optional 类进行了改进,增加了 ifPresentOrElse() 方法,我们可以借助它,来消除 if else 的判断,使用如下。优化前代码:
String str = "java"; if (str == null) { System.out.println("Null"); } else { System.out.println(str); }
优化后代码:
Optional<String> opt = Optional.of("java"); opt.ifPresentOrElse(v -> System.out.println(v), () -> System.out.println("Null"));
- 小贴士:注意运行版本,必须是 JDK 9+ 才行。
7、梳理优化判断逻辑
和第 4 点比较类似,我们可以通过分析 if else 的逻辑判断语义,写出更加易懂的代码,例如以下这个嵌套判断的优化。优化前代码:
// 年龄大于 18 if (age > 18) { // 工资大于 5000 if (salary > 5000) { // 是否漂亮 if (pretty == true) { return true; } } } return false;
优化后代码:
if (age < 18) { return false; } if (salary < 5000) { return false; } return pretty;
我们需要尽量把表达式中的包含关系改为平行关系,这样代码可读性更高,逻辑更清晰。
8、使用多态
继承、封装和多态是 OOP(面向对象编程)的重要思想,本文我们使用多态的思想,提供一种去除 if else 方法。优化前代码:
Integer typeId = 0; String type = "Name"; if ("Name".equals(type)) { typeId = 1; } else if ("Age".equals(type)) { typeId = 2; } else if ("Address".equals(type)) { typeId = 3; }
使用多态,我们先定义一个接口,在接口中声明一个公共返回 typeId
的方法,在添加三个子类分别实现这三个子类,实现代码如下:
public interface IType { public Integer getType(); } public class Name implements IType { @Override public Integer getType() { return 1; } } public class Age implements IType { @Override public Integer getType() { return 2; } } public class Address implements IType { @Override public Integer getType() { return 3; } }
- 注意:为了简便我们这里把类和接口放到了一个代码块中,在实际开发中应该分别创建一个接口和三个类分别存储。
此时,我们之前的 if else 判断就可以改为如下代码:
IType itype = (IType) Class.forName("com.example." + type).newInstance(); Integer typeId = itype.getType();
有人可能会说,这样反而让代码更加复杂了,此可谓“杀鸡焉用宰牛刀”的典型范例了。这里作者只是提供一种实现思路和提供了一些简易版的代码,以供开发者在实际开发中,多一种思路和选择,具体用不用需要根据实际情况来定了。灵活变通,举一反三,才是开发的上乘心法。