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