Java中不容拒绝的一种优雅的写法 - 编程一生

Java中不容拒绝的一种优雅的写法 - 编程一生

💡 原文中文,约900字,阅读约需3分钟。
📝

内容提要

文章主张用 Apache Commons 的 StringUtils.isNotEmpty 和 CollectionUtils.isEmpty 替代手写判空。原因:公司静态检查要求覆盖两个条件,手写需写两个单测,而 Commons 只需一个,利于覆盖率达标;静态方法只加载一份、可复用,且语义更清晰易读。

🔎

延伸解读

静态检查下的测试成本差异

文章指出,公司静态代码检查要求覆盖 xx != null 和 xx.length() > 0 两个条件,手写判空需要写两个单测才能满足条件覆盖率。而使用 Apache Commons 的 StringUtils.isNotEmpty 或 CollectionUtils.isEmpty,只需一个单测即可达标。这并非代码质量本身的差异,而是工具方法将条件判断封装后,测试覆盖的粒度要求发生了变化,对追求覆盖率指标的团队有直接参考价值。

静态方法的内存与复用优势

作者分析 StringUtils 源码后发现,其 isEmpty 实现与手写判断几乎相同,甚至多了一次取反运算,单看效率并不占优。但关键在于这些方法是静态的,类加载时初始化并常驻内存,全局只存一份。手写判断语句则只能用于当前方法,其他方法需要重复复制。因此,在大型项目中,静态工具方法能减少重复代码,提升可维护性。

语义清晰比性能微差更重要

文章强调,Apache Commons 最根本的优势是语义更加清晰、更易读。StringUtils.isNotEmpty 和 CollectionUtils.isEmpty 直接表达了“非空”或“为空”的意图,而手写的 xx != null && xx.length() > 0 需要读者自行解析逻辑。在团队协作和代码审查中,这种可读性提升往往比微小的性能差异更有价值,也更容易形成统一的编码规范。

❓

Q&A

为什么建议用 Apache Commons 的 StringUtils.isNotEmpty 替代手写的 xx != null && xx.length() > 0?

因为公司静态代码检查要求覆盖 null 和 length 两个条件,手写需要写两个单测,而使用 StringUtils.isNotEmpty 只需写一个单测,更容易达到条件覆盖率要求。

StringUtils.isNotEmpty 和手写判空在性能上有区别吗?

性能上差别不大,StringUtils.isEmpty 内部实现也是 str == null || str.length() == 0,取反后甚至多一个反运算,效率并不更高。

使用 Apache Commons 判空除了写单测方便,还有什么深层优势?

静态方法在类加载时初始化,常驻内存只存一份,可被多个方法复用,避免重复写判断语句;同时语义更清晰,代码更易读。

CollectionUtils.isEmpty 和 StringUtils.isNotEmpty 分别用在什么场景?

StringUtils.isNotEmpty 用于判断字符串非空,CollectionUtils.isEmpty 用于判断集合为空。两者都是 Apache Commons 提供的静态工具方法。

为什么说使用 Commons 判空是“不容拒绝”的?

因为公司静态代码检查规定必须覆盖 null 和 length 两个条件,手写需要两个单测,而 Commons 只需一个单测,这是硬性规定,无法拒绝。

手写判空 xx != null && xx.length() > 0 有什么缺点?

手写判空需要写两个单测来覆盖两个条件,且同样的判断语句在其他方法中需要重复复制,不利于复用,语义也不如工具方法清晰。

🏷️

标签

➡️

继续阅读