使用Collections_emptyList规避返回Null的编程习惯

落浩姑娘_4152

落浩姑娘_4152

2026-04-06

971人浏览

原创

应使用 collections.emptylist() 替代 null 返回空集合,因其不可变、泛型安全、线程安全且内存开销小;null 易引发 nullpointerexception 并增加判空负担,而 optional 更适用于单个对象而非集合。

使用collections_emptylist规避返回null的编程习惯

用 Collections.emptyList() 替代 null 作为空集合的返回值,是一种被广泛推荐的防御性编程实践。它能避免调用方频繁判空、减少 NullPointerException 风险,并让 API 更加语义清晰、行为可预测。

为什么不该返回 null 表示“无数据”

返回 null 要求每个调用方都主动检查,否则极易触发运行时异常。尤其在链式调用或流式处理中(如 service.findItems().stream().map(...)),一旦 findItems() 返回 null,程序立刻崩溃。

更严重的是,null 本身不携带类型信息,无法直接调用 size()、isEmpty() 或遍历,迫使开发者额外封装或兜底,增加冗余代码。

用 Collections.emptyList() 的正确姿势

Collections.emptyList() 返回一个**不可变、泛型安全、线程安全**的空 List,且是单例对象(多次调用返回同一实例),内存开销极小。

  • 声明时指定泛型,避免编译警告: return Collections.<string>emptyList();</string> 或使用静态导入后写 return emptyList();
  • 适用于所有需要返回空集合的场景:查询无结果、配置未启用、权限无匹配项等
  • 不要用于需后续修改的集合——它不支持 add、remove 等操作,会抛 UnsupportedOperationException

与 Optional> 的取舍

有人倾向用 Optional<list>></list> 表达“可能无结果”,但需注意:

  • 如果业务语义上“空集合”和“无结果”含义一致(例如分页查不到数据就返回空列表),直接返回 emptyList() 更自然,调用方无需解包
  • 若需区分“查不到”(null/empty)和“查到但结果为空集合”(逻辑上罕见),才考虑 Optional;多数场景属于过度设计
  • Optional 主要用于**可能不存在的单个对象**(如 findById),而非集合容器

统一团队规范的小建议

在项目中推动该习惯落地,可结合以下措施:

  • 在公共工具类或基类中封装常用空集合: Lists.empty()、Sets.empty()(基于 Collections 方法)
  • 静态代码检查(如 SonarQube)配置规则,扫描方法签名含 List / Set 返回值却存在 return null
  • Code Review 明确要求:所有集合返回值禁止为 null,优先用 emptyXxx(),必要时用 new ArrayList()(仅当需后续 add)
编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

509

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

2026.03.13

311

19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3518

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

430

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

473

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

243

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习