一、背景
今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”
二、结论
2.1 要结合具体情况看
比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用
如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。
2.2 编程习惯很重要
不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。
- 我们无法确定所有返回集合的底层接口都会给空集合,一个一个去核实真的很累
- 通常哪怕返回空集合我们也需要使用 CollectionUtils 判空然后返回,避免走一些不必要的逻辑, if 为空直接返回,减少圈复杂度。
建议写代码时多用卫语句 减少圈复杂度 (判断嵌套)
【正例】
【反例】
这种代码行数较多时可读性较差
就像《阿里巴巴 Java 开发手册》规定使用 Set 去重,很多人会 argue 说,数据量小时使用 List 去重其实性能并不差,非不愿意使用 Set 去重。
但是每个去重的场景为了非要去用 Set 去评估数据量,真的是没必要,而且养成习惯之后,稍不留神可能大数据量时也使用 List 去重,导致不必要的性能损耗。
即使小数据量,使用 Set 去重也不会带来大量的性能损耗,因此真的没必要这么做。
就像《阿里巴巴 Java 开发手册》规定 equals 常量在左侧:
但是很多人并不是很认可,会专门去“确认” 左侧的变量有可能为 null, 如果不为null ,还是将变量放在左侧,“确认”可能为 null 再将常量放在左侧。
话虽如此,但常在河边走哪有不湿鞋,稍有一次不留神就可能导致线上空指针。
何必给自己找麻烦呢?
直接使用 Objects#equals
或者 常量在左侧万无一失。
三、总结
是否要给某些属性赋值默认值,要评估清楚是否会有副作用。
其次,如果单纯为了少一个判断给出默认值,没有必要。
作为接口的提供方,如果没有副作用的情况下可以给默认值。
作为接口的使用方,我们不应该花费太多心思去考虑底层是否有默认值,都应该使用 Collectionls
判空,养成好的编程习惯,使用卫语句,提高