我刚开始在Java 8中使用@NotNull
批注,但得到了一些意想不到的结果。
我有这样的方法:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
我编写了一个JUnit测试,为参数searchList传递了空值。我原以为会发生某种类型的错误,但是好像没有注释就通过了。这是预期的行为吗?据我了解,这是允许您跳过编写样板为空的检查代码。
非常感谢@NotNull应该做什么的解释。
@Nullable
和@NotNull
本身不执行任何操作。它们应该充当文档工具。
[@Nullable
批注提醒您在以下情况下必须进行NPE检查:
[@NotNull
注释实际上是一个声明以下内容的显式合同:
例如,代替写作:
/**
* @param aX should not be null
*/
public void setX(final Object aX ) {
// some code
}
您可以使用:
public void setX(@NotNull final Object aX ) {
// some code
}
此外,@NotNull
通常由ConstraintValidators检查(例如,在春季和冬眠期)。
@NotNull
注释本身不会进行任何验证,因为annotation definition不提供任何ConstraintValidator
类型引用。
有关更多信息,请参见:
如上所述,@NotNull
本身不执行任何操作。使用@NotNull
的一种好方法是将其与Objects.requireNonNull
一起使用
Objects.requireNonNull
要激活public class Foo {
private final Bar bar;
public Foo(@NotNull Bar bar) {
this.bar = Objects.requireNonNull(bar, "bar must not be null");
}
}
,您需要龙目岛:
@NotNull
https://projectlombok.org/features/NonNull
关注:import lombok.NonNull;
SO @NotNull只是一个标签...如果要对其进行验证,则必须使用诸如休眠验证器jsr 303之类的东西>
Which @NotNull Java annotation should I use?
如果使用的是Spring,则可以通过用ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<List<Searching>> violations = validator.validate(searchingList);
注释类来强制验证:
要在测试中测试方法的有效性,您必须将其包装为@Before方法中的代理。