Java @原语的NotNull约束,为什么?

Java @原语的NotNull约束,为什么?,java,constraints,notnull,Java,Constraints,Notnull,刚刚遇到一个bug,问题是: @Column(name = "ACTIVE") @NotNull private boolean active; 在我的代码中,我忘记设置值,但它仍然“有效”,因为布尔值的默认值为false。现在,我将其更改为布尔值,这样,如果未进行有效设置,则验证将失败 为什么我被允许对显然不能为null的事物设置@NotNull约束?这是因为重构的原因,所以如果我像现在一样改为布尔型,我仍然保留预期的约束 有什么好主意可以解决这些问题吗(除了为此目的进行更多的测试)?还是应

刚刚遇到一个bug,问题是:

@Column(name = "ACTIVE")
@NotNull
private boolean active;
在我的代码中,我忘记设置值,但它仍然“有效”,因为布尔值的默认值为false。现在,我将其更改为
布尔值
,这样,如果未进行有效设置,则验证将失败

为什么我被允许对显然不能为
null
的事物设置
@NotNull
约束?这是因为重构的原因,所以如果我像现在一样改为布尔型,我仍然保留预期的约束

有什么好主意可以解决这些问题吗(除了为此目的进行更多的测试)?还是应该避免使用原语

如上所述,带注释的元素不能为null。接受任何类型

它可以是任何类型。它只检查变量是否为
notnull
,与它是否接受
null
无关

如前所述,它适用于
方法、字段、注释类型、构造函数、参数

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})

因为从注释声明的模式创建数据库需要知道列不为null。稍后,您可能会决定从
布尔值
切换到布尔值可以转换为且可为空的任何类型(不仅是布尔值,而且是整数,如Short/Integer/etc)。例如,mysql为bool分配并整定
tinyint
int8\t
)。javax.validation.constraints.NotNull的JavaDoc明确声明,它接受任何类型,不这样做没有多大意义。此注释的唯一目的是检查注释的变量是否为null。检查类型是否允许
null
已经不能满足单一责任原则。@AdrianColomitchi,谢谢,我认为这是一个非常有效的观点。我个人不使用这种功能,但我能理解为什么它很重要。我明白这一点,我的问题更多的是为什么它被允许用于原语。我不知道具体原因,因为我无法找到官方文档,但需要仔细阅读(虽然不完全相关)