为什么每个辅助构造函数应该调用之前定义的构造函数之一?

时间:2017-08-03 15:18:58

标签: scala

我是Scala编程新手。我提出了一个问题,每个辅助构造函数应该调用Scala中之前定义的构造函数之一的原因是什么?

3 个答案:

答案 0 :(得分:0)

考虑以下用Java编写的两种情况:

public class Random{

    public int a;
    public int b;

    public Random(int _a, int _b){
        this.a = _a;
        this.b = _b;
    }

    public Random(int _a){
        this(_a, 0);
    }
}

public class Random{

    public int a;
    public int b;

    public Random(int _a, int _b){
        this.a = _a;
        this.b = _b;
    }

    public Random(int _a){
        this.a = _a;
        this.b = 0;
    }
}

由于这两种情况在Java中都是有效的,但是第一种模式的设计比第二种情况更好,因为它具有更好的可维护性

考虑以下情况:

You want to change the name of either attributes

在第一个示例中,您只需要更改一次,即this.a到this.newname,并且您不需要通过所有重载的构造函数来更改它。

但是在第二个例子中,您需要遍历所有重载的构造函数。

由于这个设计原因,在Scala中你必须回调辅助构造函数的默认构造函数。

答案 1 :(得分:0)

在Scala中,每个类都是一个Primary构造函数,必须调用此构造函数来构造对象。这与Java不同,它没有主要和辅助构造函数的概念,并且所有构造函数都具有相同的优先级。

主构造函数的特殊之处在于,在其中声明的字段和参数成为类中的字段,可以被稍后调用的类中的其他方法使用,甚至可以在声明为public时直接访问。如果没有调用主构造函数,则无法保证这些字段已正确初始化。

那么为了强制主要构造函数被调用,辅助构造函数必须调用这个主构造函数,或者只要构造函数调用链最终导致主构造函数,就调用另一个构造函数。

答案 2 :(得分:0)

我们在Scala中有两种类型的构造函数。 i)主要构造函数 ii)二级构造者

我们只能通过主构造函数在scala中实例化类,即使我们使用辅助构造函数声明任何对象。

由于辅助构造函数是主构造函数的一部分(因为我们在主构造函数中定义了方法,变量,辅助构造函数),并且每个辅助构造函数都应该调用先前定义的构造函数(辅助或主要),并且此调用最终到达主构造函数。

由此我们可以得出结论,主构造函数是实例化类的主要入口点,这就是每个辅助构造函数必须和应该调用另一个构造函数(预定义的辅助或主要)的原因。