2016-10-17 56 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方法創建對象對象。這項工作將由編譯器完成

相關問題