
本文介绍在使用 Builder 模式进行对象转换时,如何避免显式 if 判空,借助 Objects.requireNonNullElse() 等标准工具方法实现 null 安全的字段赋值。
本文介绍在使用 builder 模式进行对象转换时,如何避免显式 if 判空,借助 `objects.requirenonnullelse()` 等标准工具方法实现 null 安全的字段赋值。
在 Java 开发中,使用 Builder 模式(如 Lombok 的 @Builder 或手动定义的 builder())构造不可变对象十分常见。但原始代码中若直接调用可能为 null 的 getter 方法(如 syndImage.getTitle()),会导致构建出的对象字段为 null,进而可能在后续使用中触发 NullPointerException —— 尤其当目标类字段被设计为非空(如通过 @NonNull 注解或业务契约约束)时。
此时,与其编写冗长的判空逻辑:
public static Image convert(SyndImage syndImage) {
if (syndImage == null) return null;
String title = syndImage.getTitle() != null ? syndImage.getTitle() : "Default Title";
String url = syndImage.getUrl() != null ? syndImage.getUrl() : "Default URL";
return Image.builder()
.title(title)
.url(url)
.build();
}
不如利用 JDK 9+ 提供的 Objects.requireNonNullElse(T, T) 方法——它在入参为 null 时返回指定默认值,否则原样返回;语义清晰、无副作用、线程安全,且无需额外依赖:
import java.util.Objects;
public static Image convert(SyndImage syndImage) {
// 若 syndImage 本身为 null,需单独处理(requireNonNullElse 不适用于此层)
if (syndImage == null) {
return null; // 或抛出异常 / 返回 Optional.empty(),依业务而定
}
return Image.builder()
.title(Objects.requireNonNullElse(syndImage.getTitle(), "Default Title"))
.url(Objects.requireNonNullElse(syndImage.getUrl(), "Default URL"))
.build();
}
⚠️ 注意事项:
-
Objects.requireNonNullElse()仅适用于字段级 null 处理,不替代对源对象(如syndImage)本身的空检查; - 若希望
syndImage == null时也返回默认Image(而非null),可结合Objects.requireNonNullElse(syndImage, defaultSyndImage)预处理; - 对于更复杂的默认策略(如动态生成、日志记录、降级调用),建议封装为工具方法或使用
Optional.ofNullable(...).orElseGet(...)提升可读性与扩展性; - 若项目已引入 Guava 或 Apache Commons Lang,也可考虑
MoreObjects.firstNonNull()或ObjectUtils.defaultIfNull(),但优先推荐 JDK 原生方案以降低耦合。
总结:Objects.requireNonNullElse() 是简化 null 安全转换的轻量级利器——它让代码更简洁、意图更明确,是现代 Java 中处理“有默认值的可空字段”场景的标准实践。











