NullPointerException(NPE) 绝对是Java新手的头号杀手。我曾经写过无数if (obj != null)的判断,代码又臭又长。后来,我遇到了java.util.Optional,它虽然不是为了完全取代null,但能帮助我们写出更安全、意图更明确的代码。
1. 从“防御式编程”到“声明式编程”
- 丑陋的嵌套判断(我以前常写的):
public String getUserCity(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getCity();
}
}
return "未知";
}- 使用Optional的优雅写法:
public String getUserCity(User user) {
return Optional.ofNullable(user) // 将user包装成Optional
.map(User::getAddress) // 如果user不为null,就尝试获取address
.map(Address::getCity) // 如果address不为null,就尝试获取city
.orElse("未知"); // 如果任何一环为null,则返回默认值
}代码变成了一条“链”,逻辑清晰多了。
2. 创建Optional对象的正确姿势
Optional.of(T value):value绝对不能为null,否则立即抛出NPE。只有在明确对象不为null时使用。Optional.ofNullable(T value):value可以为null。这是最常用的方法。Optional.empty():直接创建一个空的Optional对象。
3. 使用Optional的注意事项(我踩过的坑)
- 不要用Optional作为类的字段类型,因为Optional是不可序列化的,会引发序列化问题。
- 不要用Optional作为方法的参数,这会让调用方变得很麻烦。
-
isPresent()+get()是种代码坏味道,这和你直接写if (obj != null)没啥区别。尽量使用map,flatMap,orElse等方法。
总结:
Optional是一个包装器,它迫使你去思考和处理值可能缺失的情况。善用它可以减少NPE,让代码更健壮、更易读。但它是一个工具,而不是用来消灭null的终极武器。