细微之处见真章之是否要给某些类型的属性赋默认值?

时间:2022-08-09 01:01:59


一、背景

今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”

细微之处见真章之是否要给某些类型的属性赋默认值?

二、结论

2.1 要结合具体情况看

比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用
如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。

2.2 编程习惯很重要

不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。

  1. 我们无法确定所有返回集合的底层接口都会给空集合,一个一个去核实真的很累
  2. 通常哪怕返回空集合我们也需要使用 CollectionUtils 判空然后返回,避免走一些不必要的逻辑, if 为空直接返回,减少圈复杂度。

建议写代码时多用卫语句 减少圈复杂度 (判断嵌套)
【正例】

// 为空返回
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​​ 判空,养成好的编程习惯,使用卫语句,提高

细微之处见真章之是否要给某些类型的属性赋默认值?