专栏首页代码人生[代码优化]null校验的优美处理

[代码优化]null校验的优美处理

我们写java代码的时候,使用对象前,都会下意识先判断对象非null,这是防止NPE的无奈之举,毕竟入门写代码时都写过npe的代码。这么做真的好吗,每层方法中都有这null的判断,导致很多null的判断都是重复的,我们对每个方法的返回都持有一个怀疑不确定的态度,是导致代码各个地方都有非null校验的原因。

在严格的面向接口编程的语义中,通过接口方法我们就应该了解返回的是否会存在没有数据的情况,只有接口提示存在没有结果返回时,代码才会有非null的校验逻辑。在开发过程中大部分方法,是没有体现返回是否可能为null的语义的。

// 这种方法无法体现返回是否可能为null的语义
T get(Integer id);

在java8中,提供了Optional类来包装对象,用这个Optional包装对象,我们可以体现返回是否可能为null的语义,从而解决代码中无处不在的null检查。我们可以这样规定,如果方法返回的是对象,那么它的返回一定不为null;如果方法返回的是Optional对象,则表示方法返回结果可能存在null,需要做非null处理。

T get()返回不为null的实践一般是当接口为null时,抛出异常,这样就做到返回一定不为null了。

// 这种方法代表返回结果一定不为null,调用这个方法不用做null处理
T get(Integer id);

// 这种方法代表返回结果可能
Optional<T> get(Integer id);

对于返回可能存在null的方法,Optional对象也提供了一些优雅的处理方式。我之前使用Optional.isPresent来判断是否有值后再进行对应操作,感觉写法和if(!=null)一样难看,感觉不到和!=null比起来有什么优化的地方,甚至还不如使用!=null,毕竟!=null看起来更清晰一些。后来才发现是自己用错了。

// 这种写法和下面的!=null一样臃肿,如果采用这种写法,还不如使用!=null,毕竟!=null更清晰,语义更强
if(op.isPresent()) {
  todo;
}

if (op != null) {
  todo;
}

Optional提供了orElseThrowifPresent通过传入函数性接口来简化代码编写行数。orElseThrow的作用是如果为空就抛出异常,相当于if(val==null) {throw execption},之前三行代码,现在只用一行;ifPresent的作用是如果不为空,执行xxx,也是优化了if(val!=null) {}这三行代码。巧用Optional,代码中四处存在的非空校验会得到清理,方法行数大大缩短,可读性更强。

// orElseThrow的相当于下面的三行代码,减少了if和{},代码量更少,更易读。
op.orElseThrow(BizException::new);

if (value == null) {
  throw new BizException();
}
// ifPresent相当于相当于以下处理,减少了if和{},代码量更少,更易读。
op.ifPresent(value->{ todo });

if (value != null) {
  todo;
}

Optional还提供一些其他的方法来优化各种非空校验的场景,如果要使用非空校验,可以先看看optional有没有优美的方法支持。

可以优化一下代码中无处不在的非空校验,这会使得代码可读性好上很多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 童年回味——js实现贪吃蛇教程

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • jdk源码-HashMap

    AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),c...

    逝兮诚
  • 源码追踪 - Gson解析部分属性值为null

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    逝兮诚
  • 使用Optional来减少null检查

    平常我们使用null检查在项目中简直太常见了,从数据库中查询到的数据可能不存在返回null,service中处理中发现不存在返回一个null,在互相调用的时候每...

    Dylan Liu
  • Hive创建外部表CSV数据中列含有逗号问题处理

    在不能修改示例数据的结构情况下,这里需要使用Hive提供的Serde,在Hive1.1版本中提供了多种Serde,此处的数据通过属于CSV格式,所以这里使用默认...

    Fayson
  • Nullable Reference Types 可空引用类型

    但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。

    solenovex
  • 3分钟短文 | PHP判断null,别再 == 了,你真控制不住

    PHP 程序中很多地方会用到判断是否为空,比如字符串为空,数组为空,对象为空,或者其他数据类型为默认空值。

    程序员小助手
  • 测者的测试技术手册:Java中的null类型

    null是一个非常非常特殊的类型,对于每一个测试人员都要十分小心null的存在的可能性。同时null也让很多RD头疼,甚至连Java的设计者都成人null是一个...

    Criss@陈磊
  • Java中的null“类型”

    null是一个非常非常特殊的类型,对于每一个测试人员都要十分小心null的存在的可能性。同时null也让很多RD头疼,甚至连Java的设计者都成人null是一个...

    Criss@陈磊
  • JTable常见用法细则+设置某列可编辑+滚动表格

    JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一. 创建表...

    YGingko

扫码关注云+社区

领取腾讯云代金券