Optional 在Spring mvc模式下的使用场景

Optional 是java8中引入的新的类。目的是在于处理NULL值,避免繁琐的空置判断;以及用来表明某个值存在或不存在。

Optional的使用场景。

       1.属性值可能存在

假设某个属性在我们的设计中是属于可能存在的形式下,我们可以用Optional来处理,它能更精确地表达业务模型,虽然在实体类中很难直接使用 Optional 作为属性,但可以通过设计模式或其他方式间接反映属性的可选性。

public class UserProfile {
    private String firstName;
    private Optional<String> middleName; // 可选的属性
    private String lastName;

    // 省略构造方法、getter和setter

    public Optional<String> getMiddleName() {
        return middleName;
    }
    
}

         2.定义方法返回值

将方法的返回值定义用Optional返回类型。当一个方法可能无法返回一个有效的结果(比如找不到对应的数据记录),使用 Optional 作为返回类型可以强制调用者处理这种“无值”的情况。

public class UserService {
    public Optional<User> findUserById(String id) {
        // 假设从数据库查找用户逻辑
        User user = userRepository.findById(id); // 假设的方法
        return Optional.ofNullable(user);
    }
}

// 使用示例
UserService userService = new UserService();
Optional<User> optionalUser = userService.findUserById("123");
optionalUser.ifPresent(user -> System.out.println("找到了用户:" + user.getUserName()));
optionalUser.orElseThrow(() -> new NotFoundException("用户未找到"));

        3.处理复杂对象

在处理多个依赖对象,且每个对象的某些属性可能是 null 的情况下,使用 Optional 简化代码,减少嵌套的 null 检查

public class OrderService {
    public String getOrderDetails(int orderId) {
        Optional<Order> orderOpt = orderRepository.findById(orderId);
        return orderOpt.map(Order::getCustomer)
                       .map(Customer::getEmail)
                       .orElse("未知客户邮箱");
    }
}

假设我们使用传统的判空的形式来处理这串代码。

public class OrderServiceWithoutOptional {
    public String getOrderDetails(int orderId) {
        Order order = orderRepository.findById(orderId);
        if (order != null) {
            Customer customer = order.getCustomer();
            if (customer != null) {
                String email = customer.getEmail();
                if (email != null) {
                    return email;
                }
            }
        }
        return "未知客户邮箱";
    }
}

我们首先检查 order 是否为 null,然后逐层深入检查 customeremail,每一步都需要显式的 null 检查。如果层级更深,代码的嵌套将会更加复杂,这就能体现出 Optional 的优势了。

总结

Optional类的引用主要目的就在于处理null值问题,提升代码的健壮性和可读性。Optional通过提供一种标准化的方式来表达值的存在性,避免了NullPointerException的风险,特别是在处理潜在空值的复杂逻辑时,展现出显著的优势。

在设计的过程中要思考好是否需要使用到Optional。在简单场景下不加区分地使用,反而可能适得其反,增加代码的阅读和理解难度。因此,关键在于权衡:在面对可能产生null指针异常或需明确表达值的可选性的复杂逻辑时,Optional能够显著优化代码结构和安全性;而对于逻辑直接、空值情况罕见或容易处理的简单场景,坚持简约原则,直接使用基本的条件判断或许更为适宜。简言之,明智地选用Optional,旨在提升代码的表达力与可维护性,而非不加甄别地普遍应用。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值