SpringBoot4.0新特性-Null-safety消灭空指针

核心目标

该机制的核心目标就是通过在编译时进行静态代码检查,防止运行时抛出空指针异常。SpringBoot4.0默认集成JSpecify框架,支持使用JSpecify注解来声明API、字段及相关类型的可空性。

举个例子,现在有一个接口和实现类:

java 复制代码
public interface TokenExtractorService {
    String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public String extractToken(String input) {
        return input;
    }
}

我们想要在编译期就能表达:入参不允许为null,返回允许为null,该如何来做呢?

可空性设置

我们可以使用@NonNull@Nullable注解来说明这些类型的可空性。具体来说可以有两种方式,显式设置和隐式统一设置。

显式设置可空性

只需要在参数和返回上分别添加对应的注解即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(@NonNull String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(@NonNull String input) {
        return input;
    }
}
  • @NonNull:不能为空
  • @Nullable: 可以为空

加完这些标记以后,当我们调用这个方法的时候,IDEA就会有对应的错误提示:

java 复制代码
@GetMapping("/demo")
 public String demo(){
     String token = tokenExtractorService.extractToken(null);
     return token.toUpperCase();
 }

以上代码,IDEA会给出2个警告:

隐式设置可空性

大多数情况下,我们一般默认这些参数、返回、字段、类型都是非空的,因此只需要明确的说明可空即可,因此我们还可以在包级别统一设置默认的可空性,这个可以借助package-info.java来实现。

首先在service包下面添加package-info.java

java 复制代码
@NullMarked
package com.github.xjs.service;
import org.jspecify.annotations.NullMarked;
  • @NullMarkedcom.github.xjs.service这个包下面所有的参数、返回、字段、类型默认都是不允许为空
  • @NullUnmarked:默认都允许为空,一般很少用

此时,就可以删除代码中的@NonNull注解,只保留@Nullable即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(String input) {
        return input;
    }
}

更多关于可空性的话题,比如:如何设置数组、泛型的可空性,如何与CI/CD集成,如何忽略告警,请参考:SpringBoot4.0新特性-Null-safety消灭空指针

相关推荐
丶小鱼丶2 小时前
并发编程之【Java中的Thread类】
java
摇滚侠2 小时前
IDEA Maven 项目打包标准使用指南
java·maven·intellij-idea
阿里-于怀2 小时前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
java·大数据·数据库·ingress nginx
.ZGR.2 小时前
从游戏到实战的线程进阶之旅:智能无人机防空平台
java·开发语言·无人机
JMchen1232 小时前
Android TCP连接实战:详解一个高效可靠的TCP客户端实现
android·java·经验分享·网络协议·tcp/ip·移动开发·android-studio
NWU_白杨2 小时前
智能无人机平台V4
java·开发语言·无人机
青云交2 小时前
Java 大视界 -- Java 大数据在智能教育在线考试系统中的考试结果分析与教学反馈优化中的应用
java·在线考试·java大数据·智能教育
小虾米vivian2 小时前
达梦使用dmfldr和外部表导入txt数据(windows环境)
java·服务器·数据库
wsy_6662 小时前
docker
java·spring cloud·docker