【问题标题】:Don't understand @ConstructorProperties不明白@ConstructorProperties
【发布时间】:2014-11-02 19:53:27
【问题描述】:

关于@ConstructorProperties

Documentation 表示“构造函数上的注释,显示该构造函数的参数如何对应于构造对象的 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;

}

(我编辑了代码,因为从答案中,我理解注释希望代码遵循 getter 的常见大小写约定,例如 cc getter 必须是 getCc()。但为了消除歧义,我故意保留差异在 getter 名称和返回的实际变量之间)

第二个问题……

@ConstructorProperties(value="text")

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

好像是供工具使用的,只是想了解一下。

【问题讨论】:

    标签: java constructor annotations


    【解决方案1】:

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

    为此,它依赖于为字段命名 getter 和 setter 方法时使用的相同命名约定:getter 和 setter 方法名称通常通过将字段名称大写并在前缀 get 或 @987654325 前添加@(或 is 用于布尔吸气剂)。不过,单字母字段名称的示例并不是最好的说明。

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

    所以在构造函数属性的上下文中,@ConstructorProperties({"someValue"}) 表示第一个参数与 getter getSomeValue 和 setter setSomeValue 相关联。

    请记住,方法参数名称在运行时是不可见的*。重要的是参数的顺序。构造函数参数的名称或构造函数实际设置的字段无关紧要。以下仍将引用名为 getSomeValue() 的方法。

    @ConstructorProperties({"someValue"})
    public Point(int a) {
        this.c = a;
    }
    

    什么时候需要这个注解?

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

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

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


    * 正如 cmets 中所指出的,JEP 118 随 Java 8 一起发布,可用于在运行时包含参数名称。此可选功能可能会使 @ConstructorProperties 等注释过时,但前提是框架支持该功能。

    【讨论】:

    • 谢谢你的详细回答,kepep。在您的示例中,注释似乎说明了两件事…… 1/ 这种类型的对象可以返回构造函数中使用的参数的原始值。 2/ 使用名为getSomeValue() 的方法检索此参数的值。该值是否已按原样在内部存储是无关紧要的,关键是可以检索它(通过内部变量的简单副本或通过某种计算)。对吗?
    • 是的,我认为这是正确的。这个注解的文档很短,所以我猜在 java beans 规范或使用注解的框架的文档中可能会有更多信息。
    • Spring 还使用 @ConstructorProperties 注解在 XML 中声明 bean 并使用构造函数注入时按名称查找构造函数参数。这有助于避免歧义。
    • 请注意,从 Java 8 开始,“参数名称在运行时不可见”不再一定准确(根据 JEP 118,因为方法参数可以选择在运行时通过反射提供(取决于例如 -parameters 标志是否已传递给 javac)。
    猜你喜欢
    • 2021-04-10
    • 2015-04-21
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2021-05-13
    • 2020-08-20
    • 2011-02-17
    相关资源
    最近更新 更多