我在list of available constraints包中检查javax.validation
,我注意到有一个注释@Null强制该字段为空。
如果我已经知道它应该为null,我不明白将它添加到我的字段有什么意义。
例如,看看这个类:
public class MyClass{
@NotNull
private String myString1;
@Null
private String myString2;
// getter setters...
}
@NotNull
完全有道理。我不认为myString1
是空的。但@Null
使myString2
无用。有一个字段应始终为null的重点是什么。
您可能希望将@Null
与“验证组”结合使用,仅在某些情况下验证空约束。
Good explanation and example on validation groups provided by Hibernate
您将验证组定义为简单接口
public interface FirstSave {}
然后在约束中使用它
public class MyClass {
@Null(groups = FirstSave.class)
private LocalDate lastUpdate;
}
然后,如果lastUpdate
不是null
,调用validator.validate(myClassInstance)
将不会产生约束违规(使用默认组),但调用validator.validate(myClassInstance, FirstSave.class)
将。
您还可以提供有关如何使用注释的自己的实现,即我已经看到验证方法使用@Null
进行注释,其中null
通过该方法返回意味着一切都正常。在后台可能有自定义实现,如果注释方法返回非null结果该怎么办,但我没有深入到代码...
引用this文档,这里是null注释的要求。
乍看之下,按照合同设计的方式对API规范使用空注释只意味着所有API方法的签名都应该完全注释,即除了像int这样的基本类型,每个参数和每个方法的返回类型都应该标记为@NonNull或@Nullable。因为这意味着要插入很多空注释,所以很高兴知道在设计良好的代码(特别是API方法)中,@ NonNull比@Nullable更频繁。因此,通过在包级别使用@NonNullByDefault批注将@NonNull声明为默认值,可以减少注释的数量。
然而,话虽如此,是的,你是对的,@ Null没有多大意义,并且在一个设计良好的代码中,@ NotNull更重要,更频繁。 @Null或@Nullable只是为了表示在这里需要空值,并且有助于防止调用者和被调用者对空值进行冗余检查。希望这可以帮助。