Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java约束的执行顺序是什么_Java_Validation_Constraints - Fatal编程技术网

Java约束的执行顺序是什么

Java约束的执行顺序是什么,java,validation,constraints,Java,Validation,Constraints,我有一个Java方法,其中方法本身用约束(交叉参数)注释,参数也用约束(@NotNull、@NotEmpty等)注释。 方法约束是在方法参数验证之后验证的,还是未指定验证顺序?注释本身不起任何作用。他们只是做标记javac本身知道@弃用的和@重写和@FunctionInterface的意思,但效果总是要么什么都不做,要么生成编译器错误:这些注释不会导致编译器生成任何代码 除此之外,这是注释的一般原则,甚至ProjectLombok也是一个注释处理器:在编译过程中必须将Lombok放在类路径上,否

我有一个Java方法,其中方法本身用约束(交叉参数)注释,参数也用约束(@NotNull、@NotEmpty等)注释。
方法约束是在方法参数验证之后验证的,还是未指定验证顺序?

注释本身不起任何作用。他们只是做标记
javac
本身知道
@弃用的
@重写
@FunctionInterface
的意思,但效果总是要么什么都不做,要么生成编译器错误:这些注释不会导致编译器生成任何代码

除此之外,这是注释的一般原则,甚至ProjectLombok也是一个注释处理器:在编译过程中必须将Lombok放在类路径上,否则什么都不会发生

换句话说,代码中的
@NonNull
注释不可能自己生成任何空检查。这些约束应用于其他地方,或者由代码生成的注释处理器应用,您可以通过将其放在类路径上或作为注释处理器传递来显式包含该处理器。例如,您调用的代码可以内省您的方法并注意到一些事情。因此,例如,您可以:

class Example {
    @NotEmpty String name;
}
然后你可以做:

new Example("");
这不会导致异常。但你可以做到:

Validator validator = SomeHypotheticalValidationLibrary.newValidator();
validator.validate(new Example(""));
然后这个验证器会产生一个错误,指出您提供的实例验证失败。这是一个注释被内省的例子

现在回答你的问题:

验证这些约束的顺序完全取决于用于进行验证的验证库;开箱即用,注释本身不会也不能生成任何验证代码。您必须检查验证库的文档,并提供验证的上下文

如果您特别谈论lombok的,lombok会扫描您的代码以进行空检查(形式为
If(x==null)throw new Something();
或形式为
Objects.nullCheck
或guava的nullCheck)。如果它找到一个带注释的参数
@NonNull
的nullcheck,lombok什么也不做。如果没有,它将在所有显式空检查之后生成空检查。Lombok在遇到非空检查的行时停止扫描空检查(因此,既不是
if(x==null)
也不是
methodInvocation(x,“可选文本”);
@NonNull
是当前唯一导致lombok生成验证代码的注释(没有
@lombok.NotEmpty


如果您解释您使用的注释处理器/验证框架,我们可能会提供更多的见解。

是否有些IDE会根据注释的存在自动进行一些验证检查,例如
@NonNull
@NotEmpty
?@Basil-Bourque不太可能;唯一有点常用的是
@NonNull
和相关注释,但它们是编译时检查,类似于泛型。它们不会生成任何运行时代码。验证和编译时一致性检查在许多方面是截然相反的:验证意味着运行时检查。编译时一致性检查意味着不需要运行时检查的系统(事实上,它被标记为多余的死代码)。