在 Scala 中,类只有一个主构造函数,而它正是您这样定义的:class A(text: String) { ... }
. 所有其他构造函数都应该首先调用它,然后再做自己的事情。
类主体中的所有表达式都被视为主构造函数的主体。所以println(text)
在你的情况下是在主构造函数的主体中。你首先调用this()
你的def this(text: String)
构造函数,所以println
被执行,然后你才初始化text
字段。
从我的角度来看,主构造函数可以满足大多数现实生活中的用例(尤其是使用默认和命名参数)。那么您能否详细说明一下并解释为什么需要第二个?也许我们可以为您在那里面临的问题找到更好的解决方案。
关于评论的更新
如果您想在构建期间提供一组可选参数,那么我建议您使用Option
而不是null
值。所以你可以A
像这样实现你的类:
class A(val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0))
new A(b = Some(10))
所有字段现在都是常量并具有一些默认值,但您可以自定义其中一些。例如,根据某些业务逻辑,某些参数组合也可能是互斥的。在这种情况下,使用多个构造函数是合理的。但更好的解决方案是在类的伴生对象中创建多个工厂方法并将构造函数设为私有。例如,如果允许该类的用户提供a
andb
或c
,那么您可以编写如下内容:
class A private (val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0))
object A {
def apply(a: String, b: Int) = new A(Some(a), Some(b))
def apply(c: Double) = new A(c = Some(c))
}
A("test", 1)
A(11.1)