JSR 303 Bean验证 - 为什么在getter而不是setter?

yap*_*m01 29 getter bean-validation

我不明白为什么JSR 303(bean验证)是针对getter方法而不是setter的?将它放在setter方法下是不是更合乎逻辑,因为那是进入字段的入口点,应该在此之前检查验证?

Gun*_*nar 28

注释getter并不意味着在调用getter时执行验证.它仅用于标识约束应适用的属性.

将约束放在(通常是公共的)getter而不是(通常是私有的)字段上的一大优点是约束是该类型的公共API的一部分.它们甚至会被添加到生成的JavaDoc中.类型的用户知道哪种约束适用于它而不考虑其内部实现.

注释getter的另一个好处是可以将约束放在基类或接口上的方法中,也可以应用于任何子类型/实现.

  • 我认为使用getter而不是setter方法的一个优点是,这允许具有不存在setter的不可变属性,同时获得如上所述的属性级别(选择为字段级别)约束的优点. (8认同)

unc*_*ons 6

这是一个非常好的问题和我从未注意过的事情.但我想我知道答案(也是我自己从未得到过这个问题的原因).

如果您正在考虑这一点,从注释的角度来看,注释定义了验证将发生的位置,那么将它放在getter上是没有意义的.(为什么不在存储值本身时进行验证..).但这不是它的工作方式......

程序员需要告诉验证框架,需要验证哪些属性.因此,您可以将注释直接放在属性(我更喜欢)上,也可以将其放在getter上.它们都表示读操作.框架需要读取您的类的所有属性,这些属性必须经过验证.所以在这种情况下,穿上setter根本没有任何意义..理解的关键是视角......

我希望这是有道理的.


Ker*_*ğan 5

考虑以下代码:

public class BeanValidation {

    private int nameSetCount = 0;
    private int nameGetCount = 0;
    private String name;

    public String getName() {
        this.nameGetCount++;
        return name;
    }

    public void setName(String name) {
        this.nameSetCount++;
        this.name = name;
    }

}
Run Code Online (Sandbox Code Playgroud)

把注释放在上面 private String name;

注释仅仅通过查看字段就可以轻松识别字段.

把注释放在上面 public String getName()

注释只需查看返回的字段即可轻松识别字段.

把注释放在上面 public void setName(String name)

注释无法识别查看修改字段的字段,因为可以有多个字段.

  • 反射不会查看方法实现,它会查看getter/setter的名称并将其与字段进行匹配 (4认同)