在我们重载构造函数时,Oracle引用没有说明 this 关键字的最佳实践。任何人都可以建议最好的做法吗?
public class A {
private int x, y, z, p;
public A() {
this(1,1,1,1);
}
public A(int x, int y, int z, int p) {
this.x = x;
this.y = y;
this.z = z;
this.p = p;
}
}
和
public class A {
private int x, y, z, p;
public A() {
this.x = 1;
this.y = 1;
this.z = 1;
this.p = 1;
}
public A(int x, int y, int z, int p) {
this.x = x;
this.y = y;
this.z = z;
this.p = p;
}
}
答案 0 :(得分:6)
第一个是最好的。
在官方文档和许多书籍中多次引用它。这是 method-chaining 的特定情况,或者如评论中提到的其他 telescoping constructors 。它们允许您编写更少的代码并且不重复自己(DRY)。
您可以在像Apache Commons这样的实体库中找到这种方法,也可以在其他平台的最佳实践中找到。最后,着名的书籍Thinking in Java,在Initialization & Cleanup chapter(构造函数的调用构造函数部分)中使用此表单。
答案 1 :(得分:2)
第一个样本是可取的,这称为构造函数 - 伸缩或构造函数链接。遵循此模式,主构造函数(为每个可以设置的字段获取参数)可以由设置默认值的辅助构造函数调用。
在第一个示例中,只有一个地方分配了实例变量,而在第二个示例中,两个构造函数都必须知道要使用哪个实例变量,因此第一个具有较少的cut-n-paste重复。
此外,这种方式初始化在单个一致路径中进行,而不是允许完全不同的方式来初始化对象,其中初始化结果可能根据调用的构造函数而不同。这样,将始终调用添加到主构造函数的任何代码。
我借用了"主要构造函数"和"辅助构造函数"来自斯卡拉。在Scala中,这种风格由语言强制执行,不允许使用选项。