最终区别: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的对象;