Java8新特性之Optional类进阶知识

目录

●再说Optional类

●实战演练代码重构

●小结


●再说Optional类

上一篇文章概述性地介绍了一下Optional类,可能许多读者还是无法很好的掌握。笔者一开始接触这个类的时候也没有发现其有什么特别的好处,特别是对于“可以有效地避免空指针异常”这个特点理解得不够深刻,为什么这么说呢?结合一段代码,说说笔者当初的疑惑,以及是如何一步一步解决这个疑惑的:

//原始业务代码
User user = userService.getUserbyId(0);
user.setUserName("小明");


//初次使用Optionnal
User user = userService.getUserbyId(0);
Optional<User> op = Optional.of(user);
if(op.isPresent()){
    op.get().setUserName("小明");
}

逻辑很简单,设置id为0的用户姓名为“小明”。原始业务代码中,确实可能出现空指针异常,因为数据库中可能不存在id为0的用户。因此,应该做一个非空判断。

初次尝试使用Optional类,发现居然也出现了一个空指针异常,在Optional<User> op = Optional.of(user);这一行,觉得很奇怪,不是说Optional类可以装一个null对象吗?不是说Optional类可以有效地避免空指针异常吗?怎么还会这样呢?后来又仔细查了一下,发现原来学到的只是皮毛,如果用工厂方法Optional.of()构造一个Optional类,必须保证参数是一个非空对象。但这个时候依然有疑惑,不是说Optional可以包装一个null的对象吗,为什么还会报空指针异常呢?

顺藤摸瓜,我们来看看Optional.of()方法的源码:

  /**
     * Returns an {@code Optional} with the specified present non-null value.
     *
     * @param <T> the class of the value
     * @param value the value to be present, which must be non-null
     * @return an {@code Optional} with the value present
     * @throws NullPointerException if value is null
     */
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }


  /**
     * Constructs an instance with the value present.
     *
     * @param value the non-null value to be present
     * @throws NullPointerException if value is null
     */
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

  /**
     * Checks that the specified object reference is not {@code null}. This
     * method is designed primarily for doing parameter validation in methods
     * and constructor
  • 21
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值