2016-10-17 22 views
2

我有点困惑,使用scala中的伴侣对象。当你想提供多个构造函数时,通常你声明一个伴随对象并且重载方法apply。但就是这两做这件事的方式之间的区别?:在伴侣对象中使用新的关键字内部应用方法

case class Node(....) 

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

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

但我的代码似乎使用这两种形式相同。使用new关键字仅在我们拥有普通课程时才有意义? (不是案例课)?

回答

2

当你调用

val n = Node(..) 

编译器将代码扩展到Node.apply电话。现在,这些apply方法之一将内部必须调用new为了创建类型的一个实例。案例类为您提供了一个apply方法,可以使用较短的语法。

当您要提供多个构造函数,通常声明一个同伴对象和重载应用方法

这是case类的情况。您也可以使用this()提供额外的辅助构造函数:

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

注意这将不提供语法糖apply呢,你就需要使用new

+0

因此,当我有一个case类,其中我重载'apply',最好是在'apply'内使用'new'创建对象,不是吗? – elbaulp

+1

这不是更好。如果你愿意,你可以自由使用提供的'apply'。它将在内部调用'new'来创建实例。选择你喜欢的任何一个,只要确保你不递归地调用你自己的'apply'。 –

+0

非常感谢。 – elbaulp

1

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

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

相关问题