来自Java世界,我不知道Scala中对辅助构造函数的限制是如何有用的。
在Java中,我知道只要签名不同,我们就可以拥有多个构造函数。
在Scala中,辅助构造函数中的第一个调用需要是另一个辅助构造函数或类的主构造函数。为什么?这不会使Scala更具限制性吗?
答案 0 :(得分:2)
Scala基本上保证将始终调用主构造函数,因此它为类提供单个入口点;永远。无论您使用哪个辅助构造函数来创建对象,您都会知道将调用主构造函数。
你是否经历过在Java中的(无)无参数构造函数中进行所有良好的初始化,然后你(将来)或其他人出现创建另一个构造函数然后你的对象未正确初始化并启动误行为?可能不是世界上最好的设计,但我遇到了这个,并不是很有趣。
好吧,在Scala你永远不必担心这个,如果你的主构造函数中有东西它将永远被调用,否则代码将无法编译。在我的词汇中,它不是一种限制,它被称为"心灵的平静"。
答案 1 :(得分:0)
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)
),这更加灵活。