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的终极武器。

如果觉得我的文章对你有用,请随意赞赏