Skip to content

@NonNull

YellowStar5 edited this page Jul 21, 2019 · 1 revision

NonNull

我开始停止了焦虑,爱上了空指针 😘

@NonNull是在lombok v0.11.10中引入的。

概览

您可以在方法或构造函数的参数上使用@NonNul,让lombok为您生成null-check语句。

如果lombok为您生成整个方法或构造函数(例如@Data),Lombok总是将字段上通常称为@NonNull的各种注解视为生成空值检查的信号。 但是,现在,在参数上使用lombok自己的@lombok.NonNull会导致在你自己的方法或构造函数中只插入null-check语句。

null-check看起来像 if (param == null) throw new NullPointerException("param is marked @NonNull but is null"); ; 并将插入到方法的最顶层。 对于构造函数,将在任何显式this()super()调用之后立即插入null-check。

如果顶部已经存在null-check,则不会生成额外的null-check。

With Lombok

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

Vanilla Java

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person is marked @NonNull but is null");
    }
    this.name = person.getName();
  }
}

支持的配置键

lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException | Assertion] (default: NullPointerException)

当lombok生成null-check if语句时,默认情况下会抛出java.lang.NullPointerException,并将' field name is marked non-null but is null'作为异常消息。 但是,你可以在此配置键中使用IllegalArgumentException,以使lombok使用上面的消息抛出这个异常。 通过使用Assertion,将生成具有相同消息的assert语句。

lombok.nonNull.flagUsage = [warning | error] (默认值: 未设置)

如果配置了,Lombok会将@NonNull的任何用法标记为警告或错误。

Small print

Lombok对已经存在的空检查的检测方案, 包括扫描if语句或与lombok自己一样的断言语句。任何'throws'语句作为if语句的'then'部分,无论是否在括号内,都算空检查。 if语句的条件必须与PARAMNAME == null完全相同; assert语句必须与PARAMNAME != null 完全相同。你的方法中的第一个语句不是这样的空检查会停止检查空检查的过程。

虽然@Data和其他生成方法的lombok注解将触发各种众所周知的注解,表示该字段绝不能是@NonNull,但此功能仅在lombok自己的@NonNull注解中触发。

基本类型参数上的@NonNull会产生警告。不会生成空检查。

在抽象方法中参数使用@NonNull过去会产生警告; 从版本1.16.8开始承认@NonNull也有文档角色的概念,不再会产生警告。出于同样的原因,您可以将方法注解为@NonNull;这是允许的,不产生警告,也不生成任何代码。

Clone this wiki locally