Java 8中 Optional 类源码实现与分析

这是《水煮 JDK 源码》系列 的第9篇文章,计划撰写100篇关于JDK源码相关的文章

Optional 类位于 java.util 包下,自 JDK 1.8 版本新增的,它是一个 final 类,不能被继承,且构造函数是 private 的,不能被实例化,它提供了一系列对 null 空值的处理方法,是一个包装类,既可以包装非空对象,也可以包装空值,下面来看看它的定义以及默认构造函数。

public final class Optional<T> {
   
   
    private Optional() {
   
   
        this.value = null;
    }
}

众所周知,在Java开发过程中,经常需要对 null 进行判断和处理,如果漏掉了,就会引发 NullPointerException 异常,因此 null 判断几乎会遍布在代码的每个角落,那么神奇的 null 是如何诞生的呢?

1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。ALGOL W是第一批在堆上分配记录的类型语言之一。Hoare选择null引用这种方式,“只是因为这种方法实现起来非常容易”。虽然他的设计初衷就是要“通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的”,他还是决定为null引用开个绿灯,因为他认为这是为“不存在的值”建模最容易的方式。很多年后,他开始为自己曾经做过这样的决定而后悔不迭,把它称为“我价值百万的重大失误”。(引自网络)

其实,null 引入的目的是为了表示变量值的缺失。

那么在Java 8 中为什么会引入这样的一个 Optional 类呢?主要是为了对存在或缺失的变量值建模,这样一来,不管变量有没有值,都可以统一使用 Optional 来表示,它可以减少 null 值的判断逻辑,使得代码结构更加简单,同时也可以减少 NullPointerException 异常的出现。

1、构造函数

Optional 类提供了两个构造函数,都是 private 的,如下:

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

private Optional(T value) {
   
   
    // value 值不能为 null,否则会抛出空指针异常
    this.value = Objects.requireNonNull(value);
}

因为构造函数是私有的,所以不能直接实例化 Optional 类,那么如果创建 Optional 实例呢?可以通过以下的三个方法:

  • empty():通过静态工厂方法创建一个空的 Optional 实例;
  • of():将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常;
  • ofNullable():将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象;

2、方法

Optional 类提供了一些方法,主要分为 静态方法和实例方法,像上面提到的三个方法,都是静态方法,主要用于创建 Optional 实例。

2.1 静态方法

(1)empty()

empty() 方法是通过静态工厂方法创建一个空的 Optional 实例,不包含任何值,其定义如下:

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

public static<T> Optional<T> empty() {
   
   
    @SuppressWarnings("unchecked")
    Optional<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值