You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更简洁的Null检查写法:避免重复调用方法的优雅方案

优雅解决空检查赋值时重复调用方法的问题

兄弟,我太懂你这种烦恼了——每次写这种空检查赋值都要重复调用bar.getFoo(),不仅写着烦,万一这个方法是个有性能开销(比如查数据库、远程调用)或者带副作用(比如打日志、修改状态)的逻辑,重复调用简直是踩坑!下面给你几个实用又优雅的解决方案:

1. 最直接:用局部变量暂存值

这是最简单也最容易被忽略的方案,没有额外依赖,可读性拉满:

Foo tempFoo = bar.getFoo();
if (tempFoo != null) {
    this.foo = tempFoo;
}

只调用一次bar.getFoo(),把结果存到临时变量里,后续的空检查和赋值都用这个变量——逻辑清晰,没有任何冗余,绝大多数场景下这就是最优解。

2. Java 8+ 推荐:用Optional封装

如果你的项目已经用了Java 8及以上,官方推荐的Optional可以完美解决这个问题,代码简洁还符合函数式风格:

// 基础版:如果bar.getFoo()为null,就保留this.foo当前值
this.foo = Optional.ofNullable(bar.getFoo()).orElse(this.foo);

// 进阶版:如果this.foo的获取也有开销(比如是个getter方法),用orElseGet延迟调用
this.foo = Optional.ofNullable(bar.getFoo()).orElseGet(() -> this.foo);

Optional.ofNullable()会把bar.getFoo()的结果包装成Optional对象,orElse()/orElseGet()只会在值为null时才返回备选值,全程只调用一次bar.getFoo()。

3. 可复用:封装通用辅助方法

如果你的代码里有很多这种场景,可以封装一个简单的静态工具方法,一次编写处处复用:

// 工具类里的静态方法
public static <T> T updateIfNotNull(T currentValue, T newValue) {
    return newValue != null ? newValue : currentValue;
}

// 业务代码里调用
this.foo = YourUtils.updateIfNotNull(this.foo, bar.getFoo());

这个方法是泛型的,支持所有类型,调用起来非常简洁,而且同样只调用一次bar.getFoo()。

为什么你的原有写法不够优雅?

不管是原始的if判断还是三元运算符,都重复调用了bar.getFoo()——这不仅冗余,还可能带来潜在问题(比如方法多次执行的副作用),上面的方案都从根源上解决了这个重复调用的问题。

另外你提到这个问题和《Avoiding != null statements》不同,确实如此:那个问题核心是避免空检查本身,而你的场景是必须做空检查,同时要避免重复获取待赋值的变量,所以核心思路是「先获取一次值,再做判断/处理」。

内容的提问来源于stack exchange,提问作者Martijn Burger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:47