2

在 scala 中使用伴生对象我有点困惑。当您想提供多个构造函数时,通常会声明一个伴生对象并重载该apply方法。但是这两种方式有什么区别呢?:

case class Node(....)

object Node {
   def apply(...) = new Node(....) // 1 way
   def apply(...) = Node(...) // second way
}

我见过的几乎所有示例都使用第一种形式:

但我的代码似乎使用两种形式都一样。只有当我们有一个普通的类时,使用new关键字才有意义?(不是案例类)?

4

2 回答 2

2

你打电话时

val n = Node(..) 

编译器会将代码展开为Node.apply调用。现在,必须在内部调用其中一种apply方法才能创建该类型的实例。案例类为伴随对象提供了一种开箱即用的方法,以允许使用更短的语法。newapply

当你想提供多个构造函数时,通常你声明一个伴生对象并重载apply方法

案例类就是这种情况。您还可以使用以下方法提供额外的辅助构造函数this()

class Foo(i: Int) {
  def this() {
    this(0)
  }
}

请注意,这不会提供语法糖apply,您需要使用new.

于 2016-10-17T20:49:33.480 回答
1

当您声明一个案例类时。伴随对象由编译器生成,其中包含 apply 方法,其实现使用 new 关键字创建案例类的对象。

因此,您无需再次使用 apply 方法使用 new 关键字创建案例类的对象来创建伴随对象。这项工作将由编译器完成

于 2016-10-17T20:53:44.470 回答