通过源码分析 Java 8 Optional 的of和ofNullable方法的区别及使用场景

最终区别:of方法创建Optional对象时value不能为null,否则会抛空指针异常;   ofNullable方法可以传空值,创建一个value为null的对象;

-----------------------原理:---------------

具体区别直接看源码:

  • of() 方法源码:

public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

可以看到of()方法直接调用构造方法来创建对象;所以来看一下构造方法的代码:

 private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

其中构造方法又调用了requireNonNull() 方法:

 public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

可以看到,传入的值为null时,会手动抛出空指针异常;

  • ofNullable() 方法源码:

public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

可以看到,当传入的值为null时,将调用empty() 方法,empty() 方法代码如下:

 public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

empty() 方法返回了一个EMPTY常量:

private static final Optional<?> EMPTY = new Optional<>();

可以看到EMPTY常量是由Optional的无参构造函数创建的对象;无参构造函数的代码:

private Optional() {
        this.value = null;
    }

可以看到,无参构造函数创建了一个value为null的对象;所以,ofNullable() 方法创建对象时,允许传入的值为空;为空时创建一个value=null的对象;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值