之是否要给某些类型的属性赋默认值?
Posted 明明如月学长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了之是否要给某些类型的属性赋默认值?相关的知识,希望对你有一定的参考价值。
一、背景
今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”
二、结论
2.1 要结合具体情况看
比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用
如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。
2.2 编程习惯很重要
不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。
- 我们无法确定所有返回集合的底层接口都会给空集合,一个一个去核实真的很累
- 通常哪怕返回空集合我们也需要使用 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
判空,养成好的编程习惯,使用卫语句,提高
以上是关于之是否要给某些类型的属性赋默认值?的主要内容,如果未能解决你的问题,请参考以下文章