当前位置:
首页
文章
后端
详情

Java 的 Optional 并不能补充所有传统的 if-null-else 或 if-not-null-else 检查

Java 添加的​java.util.Optional​非常的受欢迎,并为总是不能返回非null值的方法提供了更流畅的代码。很不幸的是,​Optional​已被滥用,一种滥用,甚至已被过度使用。当与直接使用相比​null​没有明显优势时,我偶尔会遇到使用​Optional的代码。

当 Optional 与直接检查 null 相比没有任何优势,调用代码对它刚刚调用的方法的返回值使用​Optional.ofNullable(T)​时,可能会提示一个危险信号。如同所有的“危险信号”,这并不意味着将方法将返回值传递个​Optional.ofNullable(T)​(事实上,传递给期望 Optional 的 API 是必要的),但它的这种做法通常是用于不提供实际值,而不是直接使用返回值并检查它的是否为 null。

在 Optional 可用之前,用于检查 null 方法返回的代码以及对 null 响应采取一种方式和对非 null 响应采取另一种方式的代码如下所示)。

/**
 * Demonstrates approach to conditional based on {@code null} or
 * not {@code null} that is traditional pre-{@link Optional} approach.
 */
public void demonstrateWithoutOptional()
{
    final Object returnObject = methodPotentiallyReturningNull();
    if (returnObject == null)
    {
        out.println("The returned Object is null.");
    }
    else
    {
        out.println("The returned object is NOT null: " + returnObject);
        // code processing non-null return object goes here ...
    }
}

对于这个基本条件,很少需要涉及Optional。下一个代码片段代表了我在开发人员尝试使用Optional替换显式空检测时偶尔看到的代码类型:

/**
 * Demonstrates using {@link Optional} in exactly the manner {@code null}
 * is often used (conditional on whether the returned value is empty or
 * not versus on whether the returned value is {@code null} or not).
 */
public void demonstrateOptionalUsedLikeNullUsed()
{
    final Optional<Object> optionalReturn
       = Optional.ofNullable(methodPotentiallyReturningNull());
    if (optionalReturn.isEmpty())
    {
        out.println("The returned Object is empty.");
    }
    else
    {
        out.println("The returned Object is NOT empty: " + optionalReturn);
        // code processing non-null return object goes here ...
    }
}

此代码中的范式与传统的null检查代码基本相同,但使用​Optional.isEmpty()​执行相同的检查。这种方法不会增加任何可读性或其他优势,但确实以额外的对象实例化和方法调用为代价。

上述用法的一个变体Optional是将其​ifPresent(Consumer)​方法与其​isEmpty()​方法结合使用,形成相同的基本逻辑,如果返回值存在则做一件事,如果返回值为空则做另一件事。这在以下代码中进行了演示。

/**
 * Demonstrates using {@link Optional} methods {@link Optional#ifPresent(Consumer)}
 * and {@link Optional#isEmpty()} in similar manner to traditional condition based
 * on {@code null} or not {@code null}.
 */
public void demonstrateOptionalIfPresentAndIsEmpty()
{
    final Optional<Object> optionalReturn
       = Optional.ofNullable(methodPotentiallyReturningNull());
    optionalReturn.ifPresent(
       (it) -> out.println("The returned Object is NOT empty: " + it));
    if (optionalReturn.isEmpty())
    {
        out.println("The returned object is empty.");
    }
}

这段代码看起来比直接检查 的返回值的传统方法要短一些null,但仍然以额外的对象实例化为代价,并且需要两次方法调用。此外,首先检查 Optional 是否存在然后立即检查它是否为空感觉有点奇怪。此外,如果需要执行的逻辑比将消息写到标准输出更复杂,这种方法就变得不那么实用了。

结论

代码,处理一个方法的返回值,需要做一两件事,如果返回值是null做另一件事,如果返回值是不是 null很少会享受到环绕的任何优势,在返回的值Optional简单地检查它是否是现在还是空的。将方法的返回值包装在Optional中 可能只有Optional在流畅的链接或与Optional.


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型