更简洁的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

