我是Scala编程新手。我提出了一个问题,每个辅助构造函数应该调用Scala中之前定义的构造函数之一的原因是什么?
答案 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中实例化类,即使我们使用辅助构造函数声明任何对象。
由于辅助构造函数是主构造函数的一部分(因为我们在主构造函数中定义了方法,变量,辅助构造函数),并且每个辅助构造函数都应该调用先前定义的构造函数(辅助或主要),并且此调用最终到达主构造函数。
由此我们可以得出结论,主构造函数是实例化类的主要入口点,这就是每个辅助构造函数必须和应该调用另一个构造函数(预定义的辅助或主要)的原因。