首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[代码优化]null校验的优美处理

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

作者头像
逝兮诚
发布2020-02-11 15:02:03
1K0
发布2020-02-11 15:02:03
举报
文章被收录于专栏:代码人生代码人生

我们写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有没有优美的方法支持。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档