在方法参数中使用NotNull Annotation

Dav*_*idR 113 java

我刚开始在@NotNullJava 8中使用注释并获得一些意想不到的结果.

我有这样的方法:

public List<Found> findStuff(@NotNull List<Searching> searchingList) {
    ... code here ...
}
Run Code Online (Sandbox Code Playgroud)

我写了一个JUnit测试,传递参数searchList的null值.我期待发生某种类型的错误,但它经历过,好像注释不在那里.这是预期的行为吗?根据我的理解,这是为了让您跳过编写样板空检查代码.

@NotNull应该做什么的解释将非常感激.

jus*_*... 145

@Nullable并且@NotNull不做任何事情.它们应该充当文档工具.

@Nullable注释会提醒您的必要性,介绍了NPE检查时:

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

@NotNull注释是,实际上,声明如下明示合同:

  1. 方法不应返回null.
  2. 变量(如字段,局部变量和参数)不能保存空值.

例如,而不是写:

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

您可以使用:

public void setX(@NotNull final Object aX ) {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信混淆来自NotNull注释的java文档:`*带注释的元素不能是{@code null}.*接受任何类型.我认为**必须**字应替换为**应该**但同样取决于你如何阅读它.肯定会有一些更好的澄清 (11认同)
  • 因此,仅为了澄清NotNull部分的第2部分,实际上它应该说“应该”,而不是“不能”,因为它不能强制执行?或者,如果可以在运行时实施它,您将如何处理? (3认同)
  • 是的,它“不应该”......方法实现应该强制执行合同。 (2认同)
  • 或者,在 Java 8 中,可以使用“Optional”代替返回值中的“@Null”,并使用方法重载代替参数列表中的“@Null”:http://dolszewski.com/java/java-8 -可选用例/ (2认同)

小智 21

如上所述@NotNull没有做任何事情.使用@NotNull的好方法是将它与Objects.requireNonNull一起使用

public class Foo {
    private final Bar bar;

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

  • 只是一个小费。您也可以用一行写这样的分配:```this.bar = Objects.requireNonNull(bar,“ bar不能为null”);``` (3认同)

Nar*_*uto 6

SO @NotNull只是一个标签...如果你想验证它,那么你必须使用像hibernate验证器jsr 303这样的东西

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
 Set<ConstraintViolation<List<Searching>> violations = validator.validate(searchingList);
Run Code Online (Sandbox Code Playgroud)


sis*_*red 5

如果您使用的是 Spring,则可以通过使用以下内容注释类来强制验证@Validated

import org.springframework.validation.annotation.Validated;
Run Code Online (Sandbox Code Playgroud)

此处提供更多信息: Javax @NotNull 注释用法

你也可以使用@NonNullfrom projectlombok(lombok.NonNull)