在伴生对象的 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
}
我见过的几乎所有示例都使用第一种形式:
- "new" keyword in Scala
- http://alvinalexander.com/scala/how-to-create-scala-object-instances-without-new-apply-case-class
但我的代码使用这两种形式似乎效果相同。只有当我们有一个正常的 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 的对象再次创建伴生对象。这项工作将由编译器完成
我对在 Scala 中使用伴随对象有点困惑。当你想提供多个构造函数时,通常你声明一个伴生对象并重载 apply
方法。但是这两种方式有什么区别呢?:
case class Node(....)
object Node {
def apply(...) = new Node(....) // 1 way
def apply(...) = Node(...) // second way
}
我见过的几乎所有示例都使用第一种形式:
- "new" keyword in Scala
- http://alvinalexander.com/scala/how-to-create-scala-object-instances-without-new-apply-case-class
但我的代码使用这两种形式似乎效果相同。只有当我们有一个正常的 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 的对象再次创建伴生对象。这项工作将由编译器完成