Groovy 安全的引用符号 (?.)

本帖最后由 Alea 于 2012-12-14 10:34 编辑

当一个引用没有指向任何特定对象的时候,它的值为 null,当在一个 nu ll 引用上调用一个方法或者访问一个属性的时候,一个 NullPo interExcept ion(NPE)将被抛出,这保护了代码在在不明确的先决条件下的工作。但这也容易形成“尽力而为”来检查引用的有效性。

列表 7.8 显示了保护代码不发生 NPE 的不同途径,作为一个例子,我们希望访问在 map 中的实体中深度嵌套的对象,这样的路径表达式——通过点来连接互联的引用对象是不能保证不会发生 NPE 的,我们可以使用 if 进行显示的检查或者使用 try-catch 机制,groovy 提供 了额外的(?.)操作符来进行安全的引用,当操作符之前是一个 null 引用的时候,当前表达式的评估被终止,并且 null 被返回。

通过对比可以发现,在(3)处使用安全引用操作符是最优雅的和最具有表达性的解决方案。

注意在(1)的地方比 java 等价解决方案更紧凑,它需要三个空检查,因为表达式是从左边向右边进行评估的,如果第一个操作数评估为 false,那么&&操作符终止评估,这是大家已经知道的短路运算符。

在(2)的地方有点啰嗦并且不允许只对路径表达式进行保护控制,这也是滥用了异常处理机制,异常设计的初衷不是应用于这种情况的,引用不为 null 时容易避免和验证的。

导致一个异常然后再扑捉它等价为在汽车上安装一个大的保险杆然后撞向建筑物。

Groovy 使用安全引用操作符来组合路径并且降低了复杂性,本质上,衡量标准是代码容易理解并且能简单的检查错误。