当前位置: 首页 > 后端技术 > Java

Java重构返回Optional

时间:2023-04-01 20:39:59 Java

在Java8之前,有两种方法可以编写在特定环境下不能返回任何值的方法:要么抛出异常,要么返回null(假设这里的返回类型是对象引用类型)。但这两种方法都不是完美的。通常应该根据异常情况保留异常,因为在创建异常时捕获了整个堆栈跟踪,抛出异常的成本很高;返回null需要客户端包含特殊代码来处理null值。而在Java8中,还有第三种方式来编写无法返回值的方法。Optional类表示一个不可变容器,它可以容纳对T的单个非空引用,或者什么也没有。通常,不包含任何内容的Optional称为空,非空Optional中的值称为present。Optional本质上是一个不可变的集合,最多可以存储一个元素。Optional没有实现Collection接口,但原则上是可以的。publicTget(Stringid){if(StringUtils.isNullOrBlank(id)){returnnull;}returntestService.get(id);}以上代码在id为null时返回null。理论上,所有可以返回T的方法都可以改为返回Optional,例如:publicOptionalget(Stringid){if(StringUtils.isNullOrBlank(id)){returnOptional.empty();}returnOptional.ofNullable(testService.get(id));}如上所示,返回Optional是使用适当的静态工厂创建Optional的简单问题。这里Optional.empty()返回一个空的Optional,Optional.ofNullable接受一个可能为null的值,当传入一个null值时返回一个空的Optional。但是我们需要记住的一点是:“永远不要通过返回来返回nullOptional”,因为这完全违背了Optional的初衷。如果该方法返回Optional,则客户端必须做出选择:如果该方法无法返回值,应采取什么操作。抛出异常?提供默认值?Optional提供了isPresent()方法,可以看作是一个安全门槛。当Optional包含一个值时返回true,当Optional为空时返回false。通常我们可以这样使用它:Optionaloptional=testService.get(id);if(optional.isPresent()==false){return;}Testtest=optional.get();//courseOptional提供orElse(Tother)方法在值为空时使用默认值。Optional的更多用法,请自行学习使用。总之,如果您发现自己编写了一个从不返回值的方法,并且使用该方法的客户每次调用它时都必须考虑这种可能性,那么也许您应该返回一个Optional。

猜你喜欢