关于Optional类的源码浅析(p1)

58 阅读1分钟

最近发现了一个很好用的Java类Optional,看了下源码,简单小结一下我的理解。

例子:

/*帮助过滤掉NULL的情况*/
tempSet = Optional.ofNullable(tempSet).orElse(new HashSet<>());
  • 首先调用静态方法ofNullable,

    • 然后如果value是null,则调用empty()方法,new一个Optional对象(无参构造)返回
    • 如果value不是null,使用of函数new一个Optional对象(有参构造),ofNullable传入的值被记录在private static变量value里。
  • 其次到orElse函数,查看private static变量value

    • 如果value是null,返回orElse函数传入的other。
    • 如果value不是null,返回value。

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;

    private Optional() {//无参构造
        this.value = null;
    }
    public static<T> Optional<T> empty() {//返回无参构造的Optional对象
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    private Optional(T value) {//有参构造
        this.value = Objects.requireNonNull(value);
    }
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    
    public static <T> Optional<T> of(T value) {//返回有参构造的Optional对象
        return new Optional<>(value);
    }
    public T orElse(T other) {
        return value != null ? value : other;
    }


所以对于本例子:

  • 如果tempSet是NULL,那么ofNullable就会返回NULL,然后经过orElse函数,因为前面是NULL,所以新建一个HashSet。
  • 如果不是NULL,那么ofNullable就会调用有参构造,private final T value记录下值,orElse返回private final T value记录的值即可。