前言

每个开发者都有自己的一套通用代码库,里面封装了一些 Java API 的便捷方法,主要是为了避免模板代码的编写。但在很多时候,由于时间已久,你可能忘了当初定下的规则,以至于给方法传递错误的参数,在不恰当的时机调用方法,不对返回值进行空值检测就直接使用,等等。你必须为此承担潜在风险,甚至付出巨大代价。

正文

鉴于以上种种,我们来讨论 如何优化通用代码库,避免底层 bug 带来的潜在风险。

findbugs 是一套成熟的 bug 解决方案,通过 jsr305 提供的注解类,适合在底层通用代码库中使用。

Java 库 jsr305:

提示:大部分情况下,使用 @Nonnull 和 @Nullable 这两个注解较多。

注意:以上所有注解只是示例,并不具备实际意义,请不要效仿。

关于 @Nonnull 注解的细节:

解释:标记的元素不能为 Null。它用在字段上时,表示对象构造完成后,字段不能为 Null;用在方法上时,将应用于方法返回值的检测。

IntelliJ IDEA 插件 findbugs:

猜测:静态代码检测工具是对字节码的检测,所以源代码看不出来问题,但最终会在字节码中现行。

基于以上猜测,咱们从 TimeHelper.class 文件中寻找最终答案:

因为 DateHelper.formatNormal(value) 方法上加了 @Nonnull 注解,所以第一段逻辑是有检测冗余,而后面两段逻辑被 findbugs 识别为 This method may return a null value, but the method (or a superclass method which it overrides) is declared to return @Nonnull.。我们读 API 文档和源码,得知 DateTimeFormatter.ISO_LOCAL_TIME.format(valueTime) 不会返回 Null 值,而 findbugs 出现错误提示的原因,暂时猜测是我们没有对 format 方法返回值进行判断,并在为 Null 的情况下提供默认值。

建议

慎用 @Nonnull 注解

应该移除所有非接口类中的 @Nonnull 注解,接口的实现类可以保留。因此默认情况下,字段、方法返回值、方法参数不为 Null;其他情况下,则按需使用 @Nullable 注解,表示允许传递 Null 值。

手动检测 Null 值

在有 @Nonnull 注解的情况下,应该对未知方法(没有相关注解),进行手动检测 Null 值并提供默认值。

以上建议参考自 guava、okhttp,它们都使用了 jsr305 库。

方案二:guava | JDK 7

guava 是 Java 中最出色的工具库之一,所以 JDK 7 引进了很多 guava 中的概念。

Java 库 guava:

这里只讨论 Preconditions 类,关于其他工具,请参考 guava 官方教程。

使用示例:

Preconditions.checkNotNull(value) 方法细节:

这里为了方便理解,只展示了最简单的示例,实际上它就是对方法参数的 Null 值检测,由于提前检测比事后异常要准确得多,并且能够提供更精细的异常原因,因此推荐大家在类方法内部,添加类似的逻辑。

JDK 7 以上 API:

使用时与 guava 中的 Preconditions.checkNotNull 没有差别,不过 guava 提供了更方便的重载方法,因此从 guava 的注释中,可以发现:

建议

如果使用 guava 工具

那么在方法参数检测时,使用 Preconditions 类;在字段状态检测时,使用 Verify 类。

否则,在 JDK 7 及以上环境

使用 jsr305 和 Objects.requireNonNull 类,保证通用代码库工作正常,并且未来不会忘记调用规则。

总结

我的通用代码库是我自己做主,所以两种方案我都采取。

如果你开发的是小型项目,它需要足够纯粹的依赖环境,那么丢掉 jsr305 也是可以的;如果对依赖没有要求,偷偷把 guava 放进来也是极好的。

甚至通过学习 guava 官方教程,了解到很多潜在的代码威胁,你在开发项目时会更自信!!

java jsr305_Java | FindBugs JSR305 与 Guava Preconditions相关推荐

  1. java jsr305_java – 为什么我需要添加神器JSR305才能使用Guava 14?

    您需要将其添加为依赖项的原因是因为Guava 14在其pom中定义了依赖关系,如下所示: com.google.code.findbugs jsr305 1.3.9 provided 您问题的重要部分 ...

  2. java工具谷歌工具-Google guava工具类的介绍和使用

    工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava. guava的优点: 高效设计 ...

  3. 为什么推荐 Java 程序员使用 Google Guava 编程

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...

  4. 为什么强烈推荐 Java 程序员使用 Google Guava 编程!

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  5. 为什么强烈推荐Java程序员使用Google Guava编程(思大于行,思行合一)

    目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家分享!学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码! 以面 ...

  6. 为什么我不建议你用阿里巴巴Java规范?而是使用 Google Guava 编程?

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Themorewefind,themorewelose.Themorewek ...

  7. java 令牌解析_Java编程guava RateLimiter实例解析

    本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方 ...

  8. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

  9. java retry(重试) spring retry, guava retrying 详解

    转载 自 http://blog.51cto.com/9250070/2156431 系列说明 java retry 的一步步实现机制. java-retry 源码地址 情景导入 简单的需求 产品经理 ...

最新文章

  1. 图解GPT-2(完整版)!
  2. 反汇编的应用1-软件破解
  3. Flutter实战视频-移动电商-59.购物车_计算商品价格和数量
  4. linux vps 命令,CentOS最常用Linux vps操作命令整理大全
  5. chrome浏览器中解决embed标签 loop=true 背景音乐无法循环的问题。
  6. 【原】搬家了,请移步
  7. Storm集群安装Version1.0.1开启Kerberos
  8. 研发的未来在哪里?Serverless 云开发来了!
  9. css3 颜色 文本
  10. ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
  11. Info.plist信息
  12. picgo+onedrive+Typora用onedrive当图床
  13. C语言基础知识(学习笔记)
  14. psn注册什么服务器,psn港服注册图文教程
  15. mercury已断开服务器无响应,Mercury水星无线路由器无法上网解决办法 | 192路由网...
  16. 团队展示——我说的都队
  17. 2021-10-18记录 MediaTek MT7620A 平台对应的类型
  18. python怎么弄成黑色背景图片_python 实现将小图片放到另一个较大的白色或黑色背景图片中...
  19. python选择题库和答案_python根据题库答案自动答题
  20. 同城货运主导全新商流体系:智慧物流成胜负关键?

热门文章

  1. 深信服应用交付报表任意文件读取漏洞
  2. 【数据库】Oracle数据库的启动过程和关闭模式
  3. jdbc连接mysql数据库驱动加载失败_Java连接数据库,成功加载SQL驱动程序,但数据库连接失败...
  4. 今天终于换地方住了~
  5. 计算机管理中没有vhd,电脑重启后新建的VHD虚拟硬盘不见了怎么办|如何设置使VHD硬盘开机自动加载...
  6. 二、数据挖掘应用的分类
  7. pureftp+user mange for pureftp +修改配置文件
  8. de406行星历表的结构
  9. 宿舍人脸识别解决方案的用处有哪些
  10. 聚观早报 | SpaceX 再获 2.5 亿美元融资;Meta推迟决定实习生转正