首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不理解@ConstructorProperties

不理解@ConstructorProperties
EN

Stack Overflow用户
提问于 2014-11-03 03:53:27
回答 1查看 14.8K关注 0票数 27

关于@ConstructorProperties

Documentation说“一个构造器上的注解,它显示了构造器的参数如何与构造对象的getter方法相对应”。它给出了一个模糊的例子,因为变量名和参数是一样的。

我真的不明白为什么@ConstructorProperties({"x", "y"})会提到getters、getX()getY()。X和y的大小写与注释不一致。

因此,为了阐明以下代码中构造函数的注释应该是什么:

代码语言:javascript
复制
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名称和返回的实际变量之间的区别)

第二个问题...

代码语言:javascript
复制
@ConstructorProperties(value="text")

这个注解对JButton(String text)意味着什么?

它似乎是供工具使用的,但只是想了解一下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 09:07:51

一些序列化框架使用@ConstructorProperties将构造函数参数与相应的字段及其getter和setter方法相关联。

为此,它依赖于为字段命名getter和setter方法时使用的相同命名约定: Getter和setter方法名称通常是通过大写字段名称并加上前缀getset (或布尔getter的前缀is )来创建的。不过,使用单个字母字段名称的示例并不能最好地说明这一点。

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

因此,在构造函数属性的上下文中,@ConstructorProperties({"someValue"})意味着第一个参数与getter getSomeValue和setter setSomeValue相关联。

请记住,方法参数名称在运行时不可见*。重要的是参数的顺序。构造函数参数的名称或哪些字段实际上是由构造函数设置的并不重要。下面仍然会引用一个名为getSomeValue()的方法。

代码语言:javascript
复制
@ConstructorProperties({"someValue"})
public Point(int a) {
    this.c = a;
}

什么时候需要这个注解?

JavaBeans通常有一个公共的默认构造函数(没有参数)和所有字段的公共getter和setter方法。这意味着它们很容易序列化,不需要任何注释,而且它们始终是可变的。

@ConstructorProperties的用例似乎是不遵循JavaBeans约定的对象的反序列化,例如没有任何setter的不可变POJO:

对于序列化,框架使用对象getter获取所有值,并使用这些值来序列化对象。当对象需要反序列化时,框架必须创建一个新实例。因为对象是不可变的,所以它没有任何setter,但可以用来设置它的值。构造函数是设置这些值的唯一方法。注释用于告诉框架如何调用构造函数来正确初始化对象。

*正如评论中指出的那样,与Java8一起发布的JEP 118可用于在运行时包含参数名称。这个可选特性可以使像@ConstructorProperties这样的注释过时,但前提是框架支持该特性。

票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26703645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档