Spring null安全注解 - Go语言中文社区

Spring null安全注解


1.概述

从Spring 5开始,可以使用 null安全注解来帮助编写更安全的代码。 此功能称为“空安全性”,这是一组注解,其作用类似于监视潜在的空引用的安全措施。

空安全功能不是让摆脱不安全的代码,而是在编译时生成警告。 这样的警告可以防止在运行时发生灾难性的空指针异常(NPE)。

2.@NonNull注解

org.springframework.lang包中

在null安全功能的所有注解中,@NonNull注解是最重要的。 可以在需要对象引用的任何地方使用此注解声明非null约束:字段,方法参数或方法的返回值。

例如有一个名为Person的类:

public class Person {
    @NonNull
    private String fullName;

    public void setFullName(String fullName) {
        if (fullName != null && fullName.isEmpty()) {
            fullName = null;
        }
        this.fullName = fullName;
    }

    public String getFullName() {
        return fullName;
    }
}

该类定义有效,但有缺陷-fullName字段可以设置为null。 如果发生这种情况,在使用fullName时,我们可能会得到一个NPE。

Spring null安全特性使工具可以报告这种危险。 例如,如果在IntelliJ IDEA中编写代码,并使用@NonNull注释修饰fullName字段,则会看到警告:在这里插入图片描述
由于有了这个指示,可以提前发现问题,并能够采取适当的措施来避免运行时失败。

3.@NonNullFields注解

@NonNull注解有助于确保null安全性。 但是,如果用此注解修饰所有非null字段,则会污染整个代码库。

可以避免使用@NonNull 而使用另一个注解– @NonNullFields。 此注解适用于包级别,通知开发工具默认情况下,带注释的包中的所有字段均为非空。

为了使@NonNullFields注解生效,需要在包的根目录中创建一个名为package-info.java的文件,并使用@NonNullFields对该包进行批注:

@NonNullFields
package com.example.demo.nullannotation;

import org.springframework.lang.NonNullFields;
public class Person {

    private String fullName;

    public void setFullName(String fullName) {
        if (fullName != null && fullName.isEmpty()) {
            fullName = null;
        }
        this.fullName = fullName;
    }

    public String getFullName() {
        return fullName;
    }
}

这次,不使用@NonNull修饰fullName字段,但仍然看到类似的警告

在这里插入图片描述
@NonNullFields注解使代码更简洁,同时确保了@NonNull提供的安全级别。

5.@Nullable注解

@NonNullFields注解通常比@NonNull更好。 有时,希望免除某些字段,使其不受程序包级别指定的非null约束的约束。

用@Nullable注解进行修饰:

@Nullable
private String fullName;

在这种情况下,使用@Nullable注解覆盖字段上@NonNullFields。

6.@NonNullApi注解

@NonNullFields仅仅适用于字段。 如果希望对方法的参数和返回值产生相同的影响,则需要@NonNullApi,此注解只是用与包级别。

与@NonNullFields一样,必须在package-info.java文件中指定@NonNullApi批注:

@NonNullFields
@NonNullApi
package com.example.demo.nullannotation;

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/niugang0920/article/details/116291106
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢