@NonNull

作者: eagle_king | 来源:发表于2019-01-13 15:09 被阅读0次

@NonNull

或者:我是如何学会停止担心并且喜欢NullPointerException的。
@NonNull在lombok v0.11.10中引入。

Overview

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

如果lombok为您生成一个完整的方法或构造函数,如通过@Data, Lombok总是在字段上使用@NonNull注释视为信号以生成null-check。但是,现在使用lombok自己@lombok.NonNull的参数会导致在您自己的方法或构造函数中只插入null-check语句。

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

如果顶部已经存在空检查,则不会生成额外的空检查。

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();
  }
}

Supported configuration keys:

lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] (default: NullPointerException).
当lombok生成一个null-check if语句时,默认情况下会抛出一个以field name is marked @NonNull but is null作为异常消息的java.lang.NullPointerException。但是,您可以使用IllegalArgumentException在此配置键中,使 lombok 用此消息抛出该异常。
lombok.nonNull.flagUsage = [warning | error] (default: not set)
如果配置, Lombok会将任何@NonNull用法标记为警告或错误。

Small print

Lombok 对已经存在的 null-checks 的检测方案包括扫描看起来就像lombok自己的if语句。任何throws语句作为if语句的then部分,无论是否有括号,都将计数。if语句的条件必须看起来和PARAMNAME == null完全一样。您的方法中的第一个语句不是这样的 null-checks 会停止检查 null-checks 的过程。

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

@NonNull原始类型参数上会产生 warning。不会生成 null-check 。

@NonNull用在抽象方法的参数会生成warning。 从版本1.16.8开始,情况不再是这样了,承认@NonNull也有纪录片角色的概念。出于同样的原因,您可以将方法注释为@NonNull; 这是允许的,不生成警告,也不生成任何代码。

相关文章

网友评论

      本文标题:@NonNull

      本文链接:https://www.haomeiwen.com/subject/jgtldqtx.html