不明白@ConstructorProperties

min*_*ins 17 java constructor annotations

关于 @ConstructorProperties

文档说"构造函数上的注释,显示该构造函数的参数如何与构造对象的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;
Run Code Online (Sandbox Code Playgroud)

}

(我编辑了代码,因为从答案来看,我理解注释要求代码遵循getter的常见情况约定,例如ccgetter必须getCc().但我保持目的,为了消除歧义,getter name和实际变量之间的区别返回)

第二个问题......

@ConstructorProperties(value="text")
Run Code Online (Sandbox Code Playgroud)

对于JButton(String text),这个注释意味着什么?

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

kap*_*pex 30

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

Getter和setter方法名称通常通过大写字段的名称和前置getset(或is对于布尔getter)来创建.尽管如此,使用单个字母的示例并不是最好的.

一个更好的例子:someValue成为getSomeValue

因此,在构造函数性质的情况下,setSomeValue意味着第一个参数与名为干将匹配@ConstructorProperties({"someValue"})getSomeValue.

请记住,方法参数名称在运行时不可见.这是参数的顺序.构造函数参数的名称或实际设置的构造函数与哪些字段无关.以下仍将引用一个名为的方法setSomeValue.

@ConstructorProperties({"someValue"})
public Point(int a) {
    this.c = a;
}
Run Code Online (Sandbox Code Playgroud)

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