前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >细微之处见真章之是否要给某些类型的属性赋默认值?

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

作者头像
明明如月学长
发布2022-03-29 15:34:47
发布2022-03-29 15:34:47
51800
代码可运行
举报
运行总次数:0
代码可运行

一、背景

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

二、结论

2.1 要结合具体情况看

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

2.2 编程习惯很重要

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
// 为空返回
if(CollectionUtils.isEmpty(set)){
   return;
}

// 不为空的逻辑

【反例】

代码语言:javascript
代码运行次数:0
运行
复制
if(CollectionUtils.isNotEmpty(set)){
   // 不为空的逻辑 ,里面还有可能嵌套判断

}

这种代码行数较多时可读性较差

就像《阿里巴巴 Java 开发手册》规定使用 Set 去重,很多人会 argue 说,数据量小时使用 List 去重其实性能并不差,非不愿意使用 Set 去重。

但是每个去重的场景为了非要去用 Set 去评估数据量,真的是没必要,而且养成习惯之后,稍不留神可能大数据量时也使用 List 去重,导致不必要的性能损耗。

即使小数据量,使用 Set 去重也不会带来大量的性能损耗,因此真的没必要这么做。

就像《阿里巴巴 Java 开发手册》规定 equals 常量在左侧:

但是很多人并不是很认可,会专门去“确认” 左侧的变量有可能为 null, 如果不为null ,还是将变量放在左侧,“确认”可能为 null 再将常量放在左侧。 话虽如此,但常在河边走哪有不湿鞋,稍有一次不留神就可能导致线上空指针。 何必给自己找麻烦呢? 直接使用 Objects#equals 或者 常量在左侧万无一失。

三、总结

是否要给某些属性赋值默认值,要评估清楚是否会有副作用。 其次,如果单纯为了少一个判断给出默认值,没有必要。

作为接口的提供方,如果没有副作用的情况下可以给默认值。 作为接口的使用方,我们不应该花费太多心思去考虑底层是否有默认值,都应该使用 Collectionls 判空,养成好的编程习惯,使用卫语句,提高

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、结论
    • 2.1 要结合具体情况看
    • 2.2 编程习惯很重要
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档