Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Don';我不了解@ConstructorProperties_Java_Constructor_Annotations - Fatal编程技术网

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”})
指的是getter
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")
这个注释的意思是什么


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

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

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

一个更好的例子:
someValue
变成
getSomeValue
setSomeValue

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

@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
)。