在构造函数中委托给另一个构造函数(使用this())是好还是坏

时间:2014-07-07 14:58:39

标签: java constructor this

在我们重载构造函数时,Oracle引用没有说明 this 关键字的最佳实践。任何人都可以建议最好的做法吗?

选项1:委托给另一个构造函数

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;
    }
}

选项2:设置每个字段而不是委派

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;
    }
}

2 个答案:

答案 0 :(得分:6)

第一个是最好的。

在官方文档和许多书籍中多次引用它。这是 method-chaining 的特定情况,或者如评论中提到的其他 telescoping constructors 。它们允许您编写更少的代码并且不重复自己(DRY)。

您可以在像Apache Commons这样的实体库中找到这种方法,也可以在其他平台的最佳实践中找到。最后,着名的书籍Thinking in Java,在Initialization & Cleanup chapter构造函数的调用构造函数部分)中使用此表单。

答案 1 :(得分:2)

第一个样本是可取的,这称为构造函数 - 伸缩或构造函数链接。遵循此模式,主构造函数(为每个可以设置的字段获取参数)可以由设置默认值的辅助构造函数调用。

在第一个示例中,只有一个地方分配了实例变量,而在第二个示例中,两个构造函数都必须知道要使用哪个实例变量,因此第一个具有较少的cut-n-paste重复。

此外,这种方式初始化在单个一致路径中进行,而不是允许完全不同的方式来初始化对象,其中初始化结果可能根据调用的构造函数而不同。这样,将始终调用添加到主构造函数的任何代码。

我借用了"主要构造函数"和"辅助构造函数"来自斯卡拉。在Scala中,这种风格由语言强制执行,不允许使用选项。

相关问题