不明白@ConstructorProperties

时间:2014-11-02 19:53:27

标签: java constructor annotations

关于@ConstructorProperties

Documentation说“构造函数上的注释,显示该构造函数的参数如何与构造对象的getter方法相对应”。它给出了一个含糊不清的例子,因为变量名称与参数相同。

我真的不明白为什么@ConstructorProperties({"x", "y"})指的是吸气剂getX()getY()。 x和y的情况与注释不一致。

所以要澄清这段代码中构造函数的注释应该是什么:

public class Point {
    public Point(int a, int b) {
       this.c = a;
       this.d = b;
   }

   public int getCc() {
       return c;
   }

   public int getDd() {
       return d;
   }

   private final int c, d;

}

(我编辑了代码,因为从答案来看,我理解注释要求代码遵循getter的常见案例约定,例如cc getter必须是getCc()。但我保持目的,因为消歧,getter名称和返回的实际变量之间的差异)

第二个问题......

@ConstructorProperties(value="text")

对于JButton(String text),此注释的含义是什么?

似乎提供工具使用,但只是想了解。

1 个答案:

答案 0 :(得分:20)

@ConstructorProperties用于将构造函数参数与getter和setter方法进行匹配。为此,它依赖于为字段创建 getter setter 方法时使用的相同通用命名约定。

Getter和setter方法名称通常是通过大写字段的名称并在getset(或is前面添加布尔值getter)来创建的。尽管使用单个字母的例子并不是最好的例子。

更好的示例:someValue变为getSomeValue

因此,在构造函数属性的上下文中,@ConstructorProperties({"someValue"})表示第一个参数与名为getSomeValuesetSomeValue的getter匹配。

请记住,方法参数名称在运行时不可见。这是参数'重要的顺序。构造函数参数的名称或实际设置哪些字段的构造函数并不重要。以下内容仍将引用名为getSomeValue()的方法。

@ConstructorProperties({"someValue"})
public Point(int a) {
    this.c = a;
}

此批注的用例似乎是(取消)不可变对象的序列化。框架使用对象getter获取所有值,然后序列化对象。当需要反序列化对象时,框架必须创建一个新实例。因为对象是不可变的,所以它没有任何setter。构造函数是设置这些值的唯一方法,注释用于告诉框架如何从序列化值构造序列化对象。