如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]
Posted
技术标签:
【中文标题】如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]【英文标题】:Why use Optional.of method if a missing value is not permitted per business logic [duplicate]如果每个业务逻辑都不允许缺失值,为什么要使用 Optional.of 方法[重复] 【发布时间】:2021-07-29 10:04:23 【问题描述】:而不是像下面这样初始化optCar
变量:
Optional<'Car'> optCar = Optional.of(car);
为什么不将它简单地初始化为:
Car optCar = car;
什么时候业务逻辑不允许 car 为空?
【问题讨论】:
如果你有一个空检查你不需要可选的。但是可选的全部要点是避免空检查。如果你可以确定 car never 为空,你可以去掉这个可选的。 在这种情况下,我希望在缺失值的地方抛出 NullPointerException,以便我可以捕获错误。那么,使用 Optional.of 方法有什么意义呢? "为什么不把它初始化成..." 为什么不问问写代码的人呢? @ChandanKumar “使用 Optional.of 方法有什么意义?” -> 错误的问题。正确的问题是“为什么要使用Optional
?”
您通常将Optional.of
与文字一起使用。如果您的方法返回一个可以为 null 的 Integer
,并且在某些情况下您希望返回数字 1,则可以使用 Optional.of(1)
而不是 Optional.ofNullable(1)
。
【参考方案1】:
你完全可以。
可选的适用于您有代码的情况
If(object == null) …
相反,您使用 Optional,然后您可以很酷地访问类似流的功能和/或使您的代码更好的语句,例如:
return Optional.ofNullable(object).orElse(defaultObject);
或者另一个例子
return Optional.ofNullable(object).map(Object::toString).orElseThrow();
如果该可选对象存在,则最后一个代码返回您对象的字符串表示形式,否则将引发异常。 orElseThrow 在您确实确定对象始终存在的情况下最有用,因此这种情况可能永远不会出现,如果您知道在哪里看的话。
但是就像我一开始说的,如果你不需要这些功能,你就不需要使用它
【讨论】:
Objects.requireNonNullElse
更好地用于第一种情况 IMO。【参考方案2】:
如果您确定 car
永远不能为空,那么使用 Optional 将是一种矫枉过正。
Optional 的存在是为了清楚说明这个特定实例可以为 null,并且 Optional 需要被解包并明确检查值的缺失(或存在)。
不要照我说的,听专家说的:
我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且使用 null 来表示这种情况极有可能导致错误。
摘自 Brian Goetz 的回答 here。
【讨论】:
以上是关于如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥允许将 std::optional 与值进行比较? [复制]