
本文介绍在 Java 中使用 Objects.requireNonNullElse() 等工具方法,优雅处理 null 输入并构建对象,避免冗余的 if-null 检查,提升代码简洁性与可维护性。
本文介绍在 java 中使用 `objects.requirenonnullelse()` 等工具方法,优雅处理 null 输入并构建对象,避免冗余的 if-null 检查,提升代码简洁性与可维护性。
在日常开发中,我们常需将源数据对象(如 SyndImage)映射为业务实体(如 Image),但源字段可能为 null。若直接调用 .getTitle() 或 .getUrl() 并传入 Builder,可能导致空指针异常或生成含 null 字段的对象——这既不安全,也不符合契约设计原则。
一种常见错误写法是手动判空:
public static Image convert(SyndImage syndImage) {
if (syndImage == null) return null; // 还需额外判外层对象
return Image.builder()
.title(syndImage.getTitle() != null ? syndImage.getTitle() : "Default Title")
.url(syndImage.getUrl() != null ? syndImage.getUrl() : "Default URL")
.build();
}
不仅冗长,还易遗漏边界(如 syndImage 本身为 null)。
✅ 推荐方案:使用 java.util.Objects.requireNonNullElse()
该方法语义清晰:当参数为 null 时返回默认值,否则返回原值。它不抛异常,适合“兜底赋值”场景:
public static Image convert(SyndImage syndImage) {
if (syndImage == null) {
return null; // 外层 null 仍需单独处理(除非业务允许返回默认 Image)
}
return Image.builder()
.title(Objects.requireNonNullElse(syndImage.getTitle(), "Default Title"))
.url(Objects.requireNonNullElse(syndImage.getUrl(), "Default URL"))
.build();
}
⚠️ 注意事项:
-
requireNonNullElse不会处理外层对象为 null 的情况(如syndImage == null),需单独判断;若希望彻底避免 null,可结合Optional.ofNullable(syndImage)链式调用; - 若需返回
null而非默认值(即“遇任意字段 null 则整体返回 null”),应改用Objects.requireNonNull()(会抛NullPointerException)或自定义校验逻辑; - 默认值建议使用有意义的常量或配置项,避免硬编码字符串散落各处。
? 进阶技巧:配合 Lombok @Builder.Default 或 Jackson @JsonInclude(Include.NON_NULL) 可进一步统一空值策略,实现端到端健壮映射。











