Scala-辅助构造函数总是必须调用另一个构造函数有什么好处?

Scala-辅助构造函数总是必须调用另一个构造函数有什么好处?,scala,Scala,来自Java世界,我看不出Scala中对辅助构造函数的限制有什么帮助 在Java中,我知道我们可以有多个构造函数,只要它们的签名不同 在Scala中,辅助构造函数中的第一个调用需要是另一个辅助构造函数或类的主构造函数。为什么?这不是让Scala更具限制性吗 Scala不支持像Java这样的多个构造函数。虽然这似乎是一个不便,但作为回报,您得到的样板文件更少。使用伴随对象中的工厂方法,最终可以获得更丰富的构造语法 Scala需要一个主构造函数,因为您可以在其中包含声明,并消除在构造函数中初始化字段

来自Java世界,我看不出Scala中对辅助构造函数的限制有什么帮助

在Java中,我知道我们可以有多个构造函数,只要它们的签名不同


在Scala中,辅助构造函数中的第一个调用需要是另一个辅助构造函数或类的主构造函数。为什么?这不是让Scala更具限制性吗

Scala不支持像Java这样的多个构造函数。虽然这似乎是一个不便,但作为回报,您得到的样板文件更少。使用伴随对象中的工厂方法,最终可以获得更丰富的构造语法

Scala需要一个主构造函数,因为您可以在其中包含声明,并消除在构造函数中初始化字段的繁琐样板

class Rectangle(val width: Int, val height: Int) {
    def this(size: Int) = this(size, size)
} 
请注意,默认构造函数中的“val”关键字声明了两个公共字段。惯用Java等价物将有更多的样板(两个getter,加上构造函数中的初始化)


实际上,在实践中,大多数开发人员更喜欢伴随对象中的工厂方法(例如,
Rectangle(4)
),而不是新的
Rectangle(4,4)
),后者总体上更灵活

Scala本质上保证了主构造函数总是被调用,因此它为类提供了一个入口点;永远。无论使用哪个辅助构造函数来创建对象,您都知道将调用主构造函数

您是否曾经体验过在Java中的(比如)无参数构造函数中进行所有良好的初始化,然后您(将来)或其他人创建另一个构造函数,然后您的对象没有正确初始化并开始出现错误行为?也许不是世界上最好的设计,但我面对了这一点,这一点都不好玩


嗯,在Scala中,您永远不必担心这个问题,如果您的主构造函数中有一些东西,它将始终被调用,否则代码将无法编译。在我的词汇表中,这不是一个限制,它被称为“心安”。

好吧,Scala中多个构造函数的好处与Java中多个构造函数的好处是一样的,不是吗?你是在问Scala为什么不以同样的方式支持多个构造函数?我想这是我的正确问题。为什么一个辅助构造函数应该调用另一个辅助构造函数?为什么它不能像Java一样呢?谢谢你的解释