关于java:java重构之返回Optional

38次阅读

共计 1259 个字符,预计需要花费 4 分钟才能阅读完成。

在 Java 8 之前,要编写一个在特定环境下无奈返回任何值的办法时,有两种办法:要么抛出异样,要么返回 null(假如这里返回类型是一个对象援用类型)。但这两种办法都不够完满。通常状况下异样应该依据异样条件保留下来,因为创立异样时会捕获整个堆栈轨迹,java 培训抛出异样的老本很高;返回 null 则要求客户端必须蕴含非凡的代码来解决 null 值。

而在 Java 8 中,还有第三种办法能够编写不能返回值的办法。Optional<T> 类代表的是一个不可变的容器,它能够寄存单个非 null 的 T 援用,或者什么内容都没有。通常不蕴含任何内容的 Optional 称为空,非空的 Optional 中的值称作存在。Optional 实质上是一个不可变的汇合,最多只能寄存一个元素。Optional<T> 没有实现 Collection<T> 接口,但原则上是能够的。

public T get(String id) {
if (StringUtils.isNullOrBlank(id)) {

return null;

}
return testService.get(id);
}

上述代码,当 id 传入空时,返回 null。实践上所有能返回 T 的办法,都能够改成返回 Optional<T>,比方:

public Optional<T> get(String id) {

if (StringUtils.isNullOrBlank(id)) {return Optional.empty();
}
return Optional.ofNullable(testService.get(id));

}

如上所示,返回 Optional 是很简略的事,只有用适当的动态工厂创立 Optional 即可。在这里 Optional.empty() 返回一个空的 Optional,Optional.ofNullable 承受可能为 null 的值,当传入 null 值就返回一个空的 Optional。但咱们须要记住的一点是:「永远不要通过返回 Optional 的办法返回 null」,因为它彻底违反了 Optional 的本意。

如果办法返回 Optional,客户端必须要做出抉择:如果该办法不能返回值时应该采取什么样的措施。抛出异样?提供默认值?

Optional 提供 isPresent() 办法,它能够被当做是一个平安阈。当 Optional 中蕴含一个值时,它返回 true;当 Optional 为空时,返回 false。通常咱们能够这么应用:

Optional<Test> optional = testService.get(id);
if (optional.isPresent() == false) {

return;

}
Test test = optional.get();
// do something

当然 Optional 也提供 orElse(T other) 当值为空时,应用某个默认值的办法。

对于更多 Optional 的用法还请大家自行学习应用。

总而言之,如果发现自己在编写的办法始终无奈返回值,并且应用该办法的客户端每次在调用它时都要思考到这种可能性,那么或者就应该返回一个 Optional。

正文完
 0