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

时间:2016-10-17 20:40:07

标签: scala case-class companion-object

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

case class Node(....)

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

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

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

2 个答案:

答案 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关键字创建案例类的对象,从而再次创建伴随对象。这项工作将由编译器完成