Java 8 可选。为什么是和上当受骗的?

2022-09-01 18:11:50

我有一个关于Java 8的可选的问题,其目的是解决异常。NullPointerException

问题是,让我们选择这两种类型的原因是什么:

Optional.of(T value)     <-----non-null value, null value will throw NPE
Optional.ofNullable(T value)   <----- nullable value

因为我所期望的是,当我使用时:

Optional.of(nullValue);

它不会抛出.NullPointerException


在一些回复后扩展了我的问题:

为什么人们会选择可选而不是正常进行空检查?if-else


答案 1

Optional.of 的 javadoc 显式读取:

@throws NullPointerException if value is null

这就是按照您期望的方式处理案例的要求,使用它是一小块代码的地方::Optional.ofNullable

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

也就是说,选择一个而不是另一个的决定仍然取决于应用程序设计,就好像您的可能为或否一样


就您的期望而言,这不是实际用途。API 说明进一步澄清了这一点(格式化我的):Optional

Optional主要用于方法返回类型,其中明确需要表示“无结果”,并且使用 null 可能会导致错误。类型为的变量本身不应为;它应该始终指向一个实例。OptionalOptional


Optional 的目的是解决 NullPointerException 异常。

题外话:只是为了清楚地指出,选择当然会隐含地让你定义是否应该在运行时抛出NPE。但是,它不是在编译时确定的。


答案 2

可选的目的是解决异常NullPointerException

是的,是的,但在使用时不是在创建时。

因此,当您从某个方法接收时,可以使用 、 和 方法避免 NPE。OptionalOptional.ifPresentOptional.orElseOptional.orElseGetOptional.orElseThrow

但是,在创建可选配置时,情况并非如此。由于这是您自己的方法,因此您必须知道该对象是否为 null。


Optional 的要点是为返回值的函数提供一种方法,以指示缺少返回值。请参阅此讨论。这允许调用方继续一连串流畅的方法调用。

斯图尔特·马克斯

请阅读这篇文章以获取更详细的解释。


推荐