我在scala中使用伴侣对象有点困惑。当您想要提供多个构造函数时,通常会声明一个伴随对象并重载apply
方法。但这两种方式之间的区别是什么?:
case class Node(....)
object Node {
def apply(...) = new Node(....) // 1 way
def apply(...) = Node(...) // second way
}
我见过的几乎所有例子都使用第一种形式:
但我的代码似乎使用两种形式都一样。使用new
关键字时,只有正常的类才有意义吗? (不是案例类)?
答案 0 :(得分:2)
致电时
val n = Node(..)
编译器会将代码扩展为Node.apply
调用。现在,其中一个apply
方法将在内部必须调用new
以创建该类型的实例。案例类为配对对象提供开箱即用的apply
方法,以允许更短的语法。
如果要提供多个构造函数,通常会声明一个伴随对象并重载apply方法
案例类就是这种情况。您还可以使用this()
:
class Foo(i: Int) {
def this() {
this(0)
}
}
请注意,这不会提供糖apply
的语法,您需要使用new
。
答案 1 :(得分:1)
宣布案例类时。协同对象由编译器使用apply方法生成,其实现使用new关键字创建case类的对象。
因此,您无需使用apply方法使用new关键字创建案例类的对象,从而再次创建伴随对象。这项工作将由编译器完成