Java Don';我不了解@ConstructorProperties
关于Java Don';我不了解@ConstructorProperties,java,constructor,annotations,Java,Constructor,Annotations,关于@constructorproperty 表示“构造函数上的注释,显示该构造函数的参数如何对应于构造对象的getter方法”。它给出了一个模棱两可的例子,因为变量名和参数相同 我真的不明白为什么@constructorproperty({“x”,“y”})指的是gettergetX()和getY()。x和y的大小写与注释不一致 因此,为了澄清此代码中构造函数的注释是什么: public class Point { public Point(int a, int b) {
@constructorproperty
表示“构造函数上的注释,显示该构造函数的参数如何对应于构造对象的getter方法”。它给出了一个模棱两可的例子,因为变量名和参数相同
我真的不明白为什么@constructorproperty({“x”,“y”})
指的是gettergetX()
和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")
这个注释的意思是什么
它似乎是供工具使用的,但只是想了解一下。
@ConstructorProperties
被一些序列化框架用来将构造函数参数与相应的字段及其getter和setter方法关联起来
为此,它依赖于为字段命名getter和setter方法时使用的相同通用命名约定:getter和setter方法名称通常是通过将字段名称大写并在前缀get
或set
(对于布尔getter,则为is
)前加前缀来创建的。不过,使用单字母字段名的示例并不能最好地说明这一点
一个更好的例子:someValue
变成getSomeValue
和setSomeValue
因此,在构造函数属性的上下文中,@constructorproperty({“someValue”})
意味着第一个参数与gettergetSomeValue
和settersetSomeValue
关联
@ConstructorProperties({"someValue"})
public Point(int a) {
this.c = a;
}
请记住,方法参数名称在运行时不可见*。重要的是参数的顺序。构造函数参数的名称或构造函数实际设置的字段并不重要。下面仍然引用名为getSomeValue()
的方法
何时需要此注释 JavaBeans通常有一个公共默认构造函数(不带参数)以及所有字段的公共getter和setter方法。这意味着它们很容易序列化,无需任何注释,但它们始终是可变的
@ConstructorProperties
的用例似乎是不遵循JavaBeans约定的对象的反序列化,例如不具有任何setter的不可变POJO:
对于序列化,框架使用objects getter获取所有值,并使用这些值序列化对象。当需要反序列化对象时,框架必须创建一个新实例。因为对象是不可变的,所以它没有任何可以用来设置其值的设置器。构造函数是设置这些值的唯一方法。注释用于告诉框架如何调用构造函数来正确初始化对象
*正如Java8发布的注释中所指出的,可以在运行时用于包含参数名。此可选功能可能会使
@ConstructorProperties
之类的注释过时,但前提是框架支持该功能。谢谢您的详细回答,kepep。在您的示例中,注释似乎说明了两件事。。。1/此类型的对象可以返回构造函数中使用的参数的原始值。2/使用名为getSomeValue()
的方法检索此参数的值。该值是否已按原样存储在内部无关紧要,关键是它可以被检索(通过内部变量的简单拷贝,或通过某种计算)。是吗?是的,我想是的。这个注释的文档很短,所以我想JavaBeans规范或使用注释的框架文档中可能会有更多信息。Spring还使用@ConstructorProperties注释在用XML声明bean并使用构造函数注入时按名称查找构造函数参数。这有助于避免歧义。请注意,“参数名称在运行时不可见”在Java 8中不再一定准确(根据,因为方法参数可以在运行时通过反射(取决于-parameters
标志是否传递给javac
)。