6

我正在使用 javax.validation.Validation 来验证 jpa 实体。我总是针对相同的实体进行验证。

我想知道是否最好使用一个验证器进行所有验证,或者每次验证时都实例化一个新的验证器。

同样,每次我想使用它时实例化一个新的验证器在计算方面的成本是多少?

选项1:为每个验证实例化新的验证器。

public class Validator
{

    public static void main(String[] args)
    {


        //Validation1
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Entity entityToValidate  = new Entity();
        entityToValidate.setEmail("NOT_A_VALID_EMAIL@@@tomanyat.com");
        Set<ConstraintViolation<T>> constraintViolations =             validator.validate(entityToValidate);





        //Validation2 (Note that validator has been created yet a second time !! )
        Validator validator2 = factory.getValidator();

        Entity entityToValidate2  = new Entity();        
         entityToValidate.setEmail("NOT_A_VALID_EMAIL@@@tomanyat.com");

        Set<ConstraintViolation<T>> constraintViolations2 = validator2.validate(entityToValidate);



    }


}

选项 2:所有验证的单个验证器。

public class Validator
{

    public static void main(String[] args)
    {
        //Validator created only once
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
        Validator validator = factory.getValidator();


        //Validation #1
        Entity entityToValidate  = new Entity();
        entityToValidate.setEmail("NOT_A_VALID_EMAIL@@@tomanyat.com");

        Set<ConstraintViolation<T>> constraintViolations = validator.validate(entityToValidate);




        //Validation #2     
        Entity entityToValidate2  = new Entity();
        entityToValidate.setEmail("NOT_A_VALID_EMAIL@@@tomanyat.com");


        Set<ConstraintViolation<T>> constraintViolations2 = validator .validate(entityToValidate);



    }


}
4

2 回答 2

8

请注意Validatorjavadoc 的状态

验证 bean 实例。此接口的实现必须是线程安全的。

因此 aValidator不应该真正包含状态,除非该状态也是线程安全的。因此,您不需要创建新Validator实例,只需重复使用相同的实例,显然取决于类型。

同样,每次我想使用它时实例化一个新的验证器在计算方面的成本是多少?

这取决于您的Validator. 但是实例化(创建但不初始化对象)本身几乎可以忽略不计,尤其是当您考虑 JPA 实现执行的所有处理时。

于 2013-10-09T21:20:12.900 回答
1

重复使用同一个,显然取决于类型。

所选答案没有解释为什么重用验证器应该取决于被验证对象的类型。如果保证线程安全,我看不到它应该如何使用的任何限制。api 没有指定这样的限制。

于 2016-10-22T18:14:05.353 回答