gpt4 book ai didi

java - 不明白@ConstructorProperties

转载 作者:太空狗 更新时间:2023-10-29 23:03:51 30 4
gpt4 key购买 nike

关于@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被一些序列化框架用来将构造函数参数与相应的字段及其gettersetter方法相关联。

为此,它依赖于为字段命名 getter 和 setter 方法时使用的相同通用命名约定:Getter 和 setter 方法名称通常通过将字段名称大写并在前缀前加上 get 创建。或 set (或 is 对于 boolean getter)。不过,带有单字母字段名称的示例并不是展示这一点的最佳方式。

一个更好的例子:someValue变成 getSomeValuesetSomeValue

所以在构造函数属性的上下文中,@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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com