给构造器参数提供默认值
scala让你可以为构造器参数提供默认值。
例如,在上一节中,我们展示了你可以定义一个这样的 Socket :
class Socket(var timeout: Int, var linger: Int) {
override def toString = s"timeout: $timeout, linger: $linger"
}
这很好,但你可以通过为 timeout 和 linger 提供默认值来使这个类变得更好:
class Socket(var timeout: Int = 2000, var linger: Int = 3000) {
override def toString = s"timeout: $timeout, linger: $linger"
}
为参数提供默认值后,你可以用很多不同的方式创建 Socket :
new Socket()
new Socket(1000)
new Socket(4000, 6000)
在REPL中开起来是这样:
scala> new Socket()
res0: Socket = timeout: 2000, linger: 3000
scala> new Socket(1000)
res1: Socket = timeout: 1000, linger: 3000
scala> new Socket(4000, 6000)
res2: Socket = timeout: 4000, linger: 6000
好处
为参数提供默认值最少有两个好处:
- 你为参数提供首选的默认值
- 你使得使用你创建的这个类的人可以用自己需要的值来覆盖这些默认值
像上面展示的,第三个好处就是让使用者可以至少用三种方式构造Socket,仿佛它有三个构造器。
另一个好处:命名参数
另一个好事是 当你创建一个类的实例时,可以用命名参数:
val s = new Socket(timeout=2000, linger=3000)
这个特性有时会派上用场,例如当类的所有构造器参数都是相同的类型时。就像在这个例子中都是 Int ,下面的代码的可读性:
val s = new Socket(timeout=2000, linger=3000)
会比这个好很多:
val s = new Socket(2000, 3000)