我刚开始在Java 8中使用@NotNull
注解,并得到了一些意想不到的结果。
我有一个这样的方法:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
我编写了一个JUnit测试,为参数searchingList传入null值。我预计会发生某种类型的错误,但它通过了,好像注解不在那里。这是预期的行为吗?据我所知,这是为了让您跳过编写样板空检查代码。
如果能解释一下@NotNull到底应该做什么,我们将不胜感激。
8条答案
按热度按时间fykwrbwg1#
@Nullable
和@NotNull
本身不执行任何操作。它们应该充当文档工具。@Nullable
注解提醒您在以下情况下引入NPE检查的必要性:1.调用可以返回null的方法。
1.取消引用可以为null的变量(字段、局部变量、参数)。
@NotNull
Annotation实际上是一个显式合约,声明如下:1.方法不应返回null。
1.变量(如字段、局部变量和参数)不能
should not
保存空值。例如,不要写:
您可以用途:
此外,
@NotNull
通常由ConstraintValidators检查(例如,Spring和Hibernate)。@NotNull
注解本身不做任何验证,因为annotation definition不提供任何ConstraintValidator
类型引用。更多信息请参见:
1.注解类型
NotNull
1.注解类型
Constraint
1.接口
ConstraintValidator
h43kikqp2#
如上所述,
@NotNull
本身什么也不做。使用@NotNull
的一个好方法是将其与Objects.requireNonNull
一起使用ecbunoof3#
要激活
@NonNull
,您需要Lombok:https://projectlombok.org/features/NonNull
关注:Which @NotNull Java annotation should I use?
qacovj5a4#
如果你使用Spring,你可以通过用
@Validated
注解类来强制验证:更多信息可在这里:Javax @NotNull annotation usage
您也可以使用**
@NonNull
**fromprojectlombok
(lombok.NonNull)kqqjbcuj5#
所以@NotNull只是一个标记……如果你想验证它,那么你必须使用类似hibernate validator jsr 303的东西
wljmcqd86#
我这样做是为了创建自己的验证注解和验证器:
ValidCardType.java
(方法/字段上的注解)以及,触发检查的验证器:
CardTypeValidator.java
:您可以执行与检查
@NotNull
非常类似的操作。kognpnkq7#
要在测试中测试方法验证,必须将其 Package 为@Before方法中的代理。
使用MethodValidationProxyFactory作为:
}
然后,添加您的测试:
zz2j4svz8#