目录
官方文档的解释
of(T value):返回一个携带被指定的value,且该value不能为NULL;
ofNullable(T value):如果指定的value不为NULL,则返回携带有该value的Optional
类实例,否则返回一个value值为NULL的Optional类实例。
我们先来做两个实验
of(T value)的实验:
value值不存在:
public static void main(String[] args) {
try {
// value值不存在
String str = null;
Optional.of(str);
} catch (Exception e) {
System.out.println(e);
}
}
value值存在:
public static void main(String[] args) {
try {
// value值存在
String str = "hello world";
String value = Optional.of(str).get();
System.out.println(value);
} catch (Exception e) {
System.out.println(e);
}
}
结论:当value存在时,of(...)方法不会抛异常,若value不存在,就会抛出空指针异常。
ofNullable(T value)的实验:
value值不存在:
public static void main(String[] args) {
try {
// value值不存在
String str = null;
Optional.ofNullable(str);
} catch (Exception e) {
System.out.println(e);
}
}
value值存在:
public static void main(String[] args) {
try {
// value值存在
String str = "hello world";
Optional.ofNullable(str);
} catch (Exception e) {
System.out.println(e);
}
}
结论:不管value值存不存在,ofNullable(...)方法都不会抛出空指针异常。
源码解释
通过源码来看看这两个方法之间的区别:
of(T value) ↓
public final class Optional<T> {
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
}
可以看到这个时候value值会被交给Object类的requireNonNull()方法来处理,我们接着看看这个方法是来做什么的↓
public final class Objects {
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
}
可以发现,of方法所抛出的空指针异常其实就是在这里面被发现并处理的,也就因此限制了我们不能传递不存在的value值给of方法了。
ofNullable(T value) ↓
public final class Optional<T> {
// 实例化的一个value值为null的Optional类实例
private static final Optional<?> EMPTY = new Optional<>();
public static <T> Optional<T> ofNullable(T value) {
// 当value为null时,会调用empty(),返回一个value为null的Optional类实例,
// 若value不为null,就会调用of(..)方法,因为此时value值一定是存在的,所以即使
// 使用这个方法也是不会抛出空指针异常的。
return value == null ? empty() : of(value);
}
// 返回一个value为null的Optional类实例
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
}
区别总结
看到这里,我们可以了解到of(..)和ofNullable(..)这两个方法的区别就是当value值不存在时,of方法会抛出空指针异常,而ofNullable方法是不会抛出空指针异常的。