Spring:@Nullable和@NonNull
1 前言
Spring的注解@Nullable,@NonNull在spring的核心包spring-core中,注解部分代码如下:
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(
when = When.MAYBE
)
@TypeQualifierNickname
public @interface Nullable {
}
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierNickname
public @interface NonNull {
}
可知注解均可修饰字段、方法和参数,作用是,@Nullable修饰字段、方法和参数,那么字段可为null,方法返回值可为null,参数可为null;@NonNull修饰字段、方法和参数,那么字段不可为null,方法返回值不可为null,参数不可为null。并且对于两个注解,Primitive type members cannot be annotated,即原始类型(byte\long\int\short\boolean\float\double)不可使用此注解修饰,所以比如返回值为void或者int等的方法,int、boolean等类型的字段、参数,都不可使用这两个注解。引用对象,如String、BigDecimal、自定义类对象等,可以使用这两个注解修饰。
2 使用
package com.xiaoxu.base;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import java.math.BigDecimal;
/**
* @author xiaoxu
* @date 2022-02-18
* Ymybatis:com.xiaoxu.base.MyNull
*/
public class MyNull {
@Nullable
private String a;
@NonNull
private String b;
MyNull(@NonNull String b){
this.b = b;
}
@Nullable
BigDecimal run(){
System.out.println(this.a);
System.out.println(this.b);
return null;
}
@NonNull
String print(@NonNull String a,@Nullable String b){
System.out.println("我是print"+a+b);
return null;
}
public static void main(String[] args) {
MyNull m = new MyNull("12");
m.run();
m.print("a","b");
//@NonNull修饰的(均为引用对象才可使用其修饰)字段,不能为null,参数不能为null,方法返回值不能为null
//否则会有标黄提示(弱提示),代码可正常运行
MyNull m1 = new MyNull(null);
String x = null;
m1.run();
m1.print(x,null);
}
}
执行结果如下所示:
null
12
我是printab
null
null
我是printnullnull
idea代码标黄,弱提示:
可知,@Nullable和@NonNull修饰引用类型的字段、参数,以及返回值为引用类型的方法,且仅是弱提示,实际代码依然可以正常运行。