在方法参数中使用 NotNull 注释

2022-08-31 06:03:51

我刚刚开始在Java 8中使用注释,并得到了一些意想不到的结果。@NotNull

我有一个这样的方法:

public List<Found> findStuff(@NotNull List<Searching> searchingList) {
    ... code here ...
}

我写了一个JUnit测试,传入参数searchList的空值。我本来以为会发生某种类型的错误,但它经历了好像注释不存在一样。这是预期的行为吗?据我所知,这是为了让您跳过编写样板空检查代码。

如果能解释@NotNull究竟应该做什么,将不胜感激。


答案 1

@Nullable@NotNull自己什么都不做。它们应该充当文档工具。

注释提醒您,在以下情况下有必要引入 NPE 检查:@Nullable

  1. 调用可返回 null 的方法。
  2. 取消引用可以为 null 的变量(字段、局部变量、参数)。

实际上,注释是一个显式协定,声明以下内容:@NotNull

  1. 方法不应返回 null。
  2. 变量(如字段、局部变量和参数)不应包含 null 值。

例如,与其写:

/**
 * @param aX should not be null
 */
public void setX(final Object aX ) {
    // some code
}

您可以使用:

public void setX(@NotNull final Object aX ) {
    // some code
}

此外,通常由 ConstraintValidator 检查(例如,在春季和休眠状态下)。@NotNull

批注本身不执行任何验证,因为批注定义不提供任何类型引用。@NotNullConstraintValidator

有关详细信息,请参阅:

  1. 豆类验证
  2. 不,不.java
  3. 约束.java
  4. 约束验证器.java

答案 2

如上所述,它本身没有任何作用。一个好的使用方法是将其与Objects.requireNonNull一起使用。@NotNull@NotNull

public class Foo {
    private final Bar bar;

    public Foo(@NotNull Bar bar) {
        this.bar = Objects.requireNonNull(bar, "bar must not be null");
    }
}

推荐