- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
关于@ConstructorProperties
Documentation说“构造函数上的注释,显示该构造函数的参数如何对应于构造对象的 getter 方法”。它给出了一个模棱两可的例子,因为变量名与参数相同。
我真的不明白为什么 @ConstructorProperties({"x", "y"})
引用 getters 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),这个注解意味着什么? ?
好像是提供给工具使用的,只是想了解一下。
最佳答案
@ConstructorProperties
被一些序列化框架用来将构造函数参数与相应的字段及其getter和setter方法相关联。
为此,它依赖于为字段命名 getter 和 setter 方法时使用的相同通用命名约定:Getter 和 setter 方法名称通常通过将字段名称大写并在前缀前加上 get
创建。或 set
(或 is
对于 boolean getter)。不过,带有单字母字段名称的示例并不是展示这一点的最佳方式。
一个更好的例子:someValue
变成 getSomeValue
和 setSomeValue
所以在构造函数属性的上下文中,@ConstructorProperties({"someValue"})
表示第一个参数与getter getSomeValue
相关联和二传手setSomeValue
.
请记住,方法参数名称在运行时不可见*。重要的是参数的顺序。构造函数参数的名称或构造函数实际设置的字段并不重要。以下仍将引用名为 getSomeValue()
的方法.
@ConstructorProperties({"someValue"})
public Point(int a) {
this.c = a;
}
什么时候需要这个注解?
JavaBeans 通常有一个公共(public)默认构造函数(不带参数)和所有字段的公共(public) getter 和 setter 方法。这意味着它们无需任何注释即可轻松序列化,而且它们始终是可变的。
@ConstructorProperties
的用例似乎是不遵循 JavaBeans 约定的对象的反序列化,例如没有任何 setter 的不可变 POJO:
对于序列化,框架使用对象 getter 获取所有值,并使用这些值来序列化对象。当需要反序列化对象时,框架必须创建一个新实例。因为该对象是不可变的,所以它没有任何可用于设置其值的 setter 。构造函数是设置这些值的唯一方法。注解用于告诉框架如何正确调用构造函数来初始化对象。
* 正如评论中指出的那样,JEP 118随 Java 8 一起发布,可用于在运行时包含参数名称。此可选功能可以制作类似 @ConstructorProperties
的注释已过时,但前提是框架支持该功能。
关于java - 不明白@ConstructorProperties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703645/
关于@ConstructorProperties Documentation说“构造函数上的注释,显示该构造函数的参数如何对应于构造对象的 getter 方法”。它给出了一个模棱两可的例子,因为变量名
我真的很困惑 jackson(2.9.6 版本)ObjectMapper 如何与 @ConstructorProperties 注释一起工作。 似乎映射器忽略了存在于 @ConstructorProp
我的域对象使用 lombok 进行了增强,它生成 java.beans @ConstructorProperties不可变对象(immutable对象)构造函数的注释。 现在在我的前端工件中,我想使用
我是一名优秀的程序员,十分优秀!