Java判空,Optional和工具类真香?还是if(obj == null)更靠谱?

createh53周前 (12-20)技术教程19

背景描述

最近在开发项目时,我遇到了一个需要从 Hyperlink 对象中获取 link 属性的小需求。这个过程中我需要判断 Hyperlink 对象是否为 null,以防止出现空指针异常。面对这种情况,有两种常见的处理方式。一种是使用 Optional.ofNullable() 方法,另一种则是使用传统的 null 检查。这两种方法分别对应以下代码片段:

// 通过Optional.ofNullable()判断是否为null
String link = Optional.ofNullable(hyperlink)
        .map(Hyperlink::getLink)
        .orElse(null);
        
// 传统方法判断是否为null
String link = hyperlink != null ? hyperlink.getLink() : null;

那么,在这种情况下,究竟该选择哪一种方法来判断 null 值更合适呢?

代码分析

两段代码都能够实现从 Hyperlink 对象获取 link 属性,并防止出现空指针异常(NullPointerException)。我们可以从代码风格、可读性和性能多个角度进行分析。

1、使用 Optional.ofNullable()

String link = Optional.ofNullable(hyperlink)
        .map(Hyperlink::getLink)
        .orElse(null);

这种方法使用了 Optional.ofNullable(),结合 map() 来处理可能的 null 值。它的优势在于:

  • 简洁优雅:链式调用的方式使代码更加简洁,容易理解,尤其适合团队已经熟悉并经常使用 Optional 的情况。
  • 防止空指针异常:Optional 是一种现代化的编程风格,能有效避免空指针异常,特别适用于复杂的嵌套检查。

然而,Optional 的底层实现涉及包装和解包操作,在高频调用场景下可能会带来一定的性能开销。此外,如果团队中有些成员不熟悉 Optional,可能需要额外的学习成本。

2、使用传统的 null 检查

String link = hyperlink != null ? hyperlink.getLink() : null;

使用传统的三元运算符直接判断 null,这种方式的优势包括:

  • 易于理解:这种写法简单直观,几乎不需要解释,特别适合那些对 Optional 不熟悉的团队成员。
  • 性能更优:直接的 null 检查避免了 Optional 的包装和解包操作,性能上会稍好,尤其在对性能要求较高的场景下更具优势。

具体选择哪种方式,取决于项目的实际情况,这里提供一些建议:

  • 项目要求:如果项目对性能有严格要求或团队不熟悉 Optional,那么传统的 null 检查更为合适。
  • 团队代码风格:我觉得到底怎么用,还是要看项目,项目用啥咱们就用啥,不要特立独行,如果项目有硬性要求,就按照要求来;如果没有要求,就参考之前的代码风格;如果是新项目,可以使用第二段代码,这么简单易懂,写起来肯定没错。

拓展:空集合判断

在 Java 开发中,判断集合是否为空是一个非常常见的操作。通常有两种方式可以实现这一点:

  1. 使用原生方法:list == null || list.isEmpty()
  2. 使用工具类方法,如 Spring 的 CollectionUtils.isEmpty() 或 Apache Commons Lang3 的 CollectionUtils.isEmpty()

那么,究竟哪一种方法更好呢?在大多数情况下,我更建议使用第一种原生方法,原因如下:

1、更简洁直观

使用 list == null || list.isEmpty() 的写法更加直观易懂,符合大多数人的代码风格。它不依赖任何外部库,只使用了 Java 原生的集合操作方式。因此,在不需要大量使用 Spring 或其他第三方库的场景下,这种方法更加适合。

如果代码需要在不同项目中复用或发布为公共类库,选择原生方法可以减少对外部库的依赖,使代码更容易维护和移植。

2、减少依赖外部库

CollectionUtils.isEmpty() 是 Spring 或 Apache Commons Lang3 中提供的工具类方法。尽管这些工具类在大型项目中非常有用,但在某些场景下,减少对外部库的依赖显得尤为重要。

例如,在一个不广泛使用 Spring 的项目中,使用 Java 原生方法可以让代码更独立,降低对外部库的耦合度。如果项目需要减少 Spring 的依赖,选择原生方法无疑是更好的做法。

3、性能上的微小优势

从性能角度来看,list == null || list.isEmpty()CollectionUtils.isEmpty() 略微有些优势。虽然这种性能差异在大多数场景下是微不足道的,但在追求极致性能的情况下,直接使用原生方法可以减少一次静态方法调用。工具类的方法内部通常也只是对 nullisEmpty() 进行判断,因此,直接使用原生方法更加直接和高效。

4、保持项目的一致性

在整个项目中保持一致的代码风格是至关重要的。如果你的项目广泛使用工具类,那么在所有相关代码中保持使用工具类的方法有助于代码的统一性和可维护性。

如果项目中已经大量使用了 CollectionUtils.isEmpty(),那么继续使用工具类可以保持一致性;反之,如果项目中没有依赖这些工具类,那么选择原生方法就更合适。统一的代码风格不仅有助于团队协作,还能减少后期的维护成本。

原文:https://juejin.cn/post/7409467432900427827

作者:洛小豆

#记录我的9月生活#

相关文章

前端面试题(1):undefined和null的区别

寒冬来临,裁员的消息此起彼伏。现在准备面试肯定是有备无患,我准备了一系列前端面试的常见问题,和大家一起学习。不管你是不是有找工作的需求,多掌握一些肯定是有益无害。1.undefined和null有什么...

在Java中如果对象的引用被设置为null,垃圾收集器应当如何工作?

在Java中,如果在程序初始化之初就将一个对象的引用设置为NULL。那么JVM的垃圾回收机制该如何工作呢?是不是就会立即释放该对象所占用的内存呢?答案是否定的,将一个对象设置为NULL,垃圾回收机制并...

Java中当对象不再使用时,不赋值为null会导致什么后果?

前言许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。鉴...

避免Java中NullPointerException的Java技巧和最佳实践

欢迎关注头条号:Java小野猫Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢。下面我们就从几个方面来入手,解决这个棘手的?问题...

MySQL数据库的表中 NULL 和 空值 到底有什么区别呢

浅谈 NULL 和 空值的区别NULL也就是在字段中存储NULL值空字符串值也就是字段中存储空字符('')我们来通过测试来看看 他们彼此的区别:1、占用空间区别mysql> se...