Spring 5 core 中的 @NonNull 是个什么鬼?!
2021-03-03 22:04
736 查看
说明
在
Spring 5的 spring-core jar包中添加了
jsr-305相关注解。在
Spring源码中已经被大量使用。如下图:
JSR-305介绍
诸如 FindBugs、IntelliJ、Checkstyle 和 PMD 这样的静态分析工具在 Java 开发中得到了广泛应用。这些工具都很强大,但是有一些共同的问题它们都很难解决。在 API 的设计中,有一些决策是不言而喻的,比如何时值可以为 null,或者何时数字值不能为负。完备的 API 会将这些设计细节记录在 JavaDoc 之中,但是分析工具却无法发现类似细节,从而有可能将其忽略或是导致错误的检测结果。
为了解决这些问题,有些静态分析工具开发人员试图使用注解来定义相关细节。比如 FindBugs 和 IntelliJ 都定义了自己的注解,以表示方法何时返回 null。不过,这两个工具使用的注解有细微不同,也因此有了标准化的需求。由 FindBugs 创建人 Bill Pugh 带领制定的 JSR-305 标准,试图创建一套标准注解供分析工具使用,同时希望允许开发人员根据自己的需要添加额外的注解。当前提案中包括供判断是否为空、正负号、开发语言和线程等方面的众多注解。
更多jsr-305介绍请查看,JSR-305:供检查软件缺陷用的注解[1]
使用场景
由上文的介绍,我们知晓了
jsr-305的目标:供检查软件缺陷用。方便静态代码检查工具及时查找出潜在的 bug。所以这些注解特别适合基础组件和工具包,增强
IDE提示,减少潜在
bug。
lutool 1.x 中复制了spring 5中的
jsr-305相关注解到源码中,到 mica - Spring boot 微服务开发核心包[2] 由于依赖的
Spring boot 2.1.x,则直接使用
spring core中的注解。
使用
添加包级规则
1.
@NonNullFields表示
Field不为null。
2.
@NonNullApi表示
方法参数和
返回值不为null。
3.对于不想使用包级别不为null,可直接使用
@NonNull,使用方式同下文
@Nullable。
在包下添加
package-info.java,内容如下:
@NonNullApi@NonNullFieldspackage net.dreamlu.mica.core.utils;import org.springframework.lang.NonNullApi;import org.springframework.lang.NonNullFields;
添加完该注解后编写代码时编辑器会给出提示,如下图:
@Nullable
对于部分可为空的
Field、
方法参数和
返回值需要使用
@Nullable进行标示。
参数可为null
public static boolean isBlank(@Nullable final CharSequence cs) { return !StringUtils.hasText(cs);}
返回值可为null
@Nullablepublic static String getCookieVal(HttpServletRequest request, String name) { Cookie cookie = getCookie(request, name); return cookie != null ? cookie.getValue() : null;}
属性可为null
@Nullableprivate String msg;
相关文章推荐
- 深入浅出Android Support Annotation(什么是android.support.annotation.NonNull的拓展)【转】
- Spring 中@NonNull、@NonNullApi、@NonNullFields以及@Nullable注解及其示例
- 深入浅出Android Support Annotation(什么是android.support.annotation.NonNull的拓展)【转】
- rabbittmq 出现NullPointerException at org.springframework.amqp.rabbit.core.RabbitTemplate.onMessage
- 什么是跨域,Cors协议,spring cors
- Web前端面试笔试题——null和undefined有什么区别么?
- Spring参考手册-第Ⅰ部分 核心技术(Core)
- String的对象什么情况下输出为null
- spring@Autowired注入为null的问题,2017年9月14日21点41分记录
- PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe 是什么意思?
- javascript 什么事null,什么是undefine
- 在spring中一个请求经历了什么
- springmvc+mybatis xml中SUM()方法返回NULL的解决办法
- springboot 整合shrio Myrealm bean注入为null
- 从架构演进的角度聊聊Spring Cloud都做了些什么?
- "" 与null有什么区别
- 请问 process p =null ;这个有什么用
- 阿里Dubbo疯狂更新,关Spring Cloud什么事?
- spring core io 包 ResourceLoader接口
- spring源码分析-core.io包里面的类