之是否要给某些类型的属性赋默认值?

Posted 明明如月学长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了之是否要给某些类型的属性赋默认值?相关的知识,希望对你有一定的参考价值。

一、背景

今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 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 判空,养成好的编程习惯,使用卫语句,提高

以上是关于之是否要给某些类型的属性赋默认值?的主要内容,如果未能解决你的问题,请参考以下文章

类属性默认值

json过滤某些属性 之@jsonignore

注意:C语言结构体里不能赋初始值!

怎么给参数赋两个值

如何根据 typegoose 属性中的某些条件返回默认值?

如何给C语言结构体中的成员赋默认值