在伴生对象的 apply 方法中使用 New Keyword

Using New Keyword inside apply method in a companion object

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

case class Node(....)

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

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

但我的代码使用这两种形式似乎效果相同。只有当我们有一个正常的 class 时,使用 new 关键字才有意义吗? (不是个案class)?

当你打电话时

val n = Node(..) 

编译器会将代码扩展为 Node.apply 调用。现在,这些 apply 方法之一将在内部 必须 调用 new 才能创建该类型的实例。 Case 类 为伴随对象提供开箱即用的 apply 方法,以允许更短的语法。

When you want to provide multiple constructors, usually you declare a companion object and overload the apply method

案例类就是这种情况。您还可以使用 this():

提供额外的辅助构造函数
class Foo(i: Int) {
  def this() {
    this(0)
  }
}

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

当您申报案件时class。伴随对象由编译器生成,其中包含 apply 方法,其实现使用 new 关键字创建案例 class 的对象。

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