例項化沒有引數的類 vs()
假設我們有一個沒有建構函式引數的 MyClass 類:
class MyClass
在 Scala 中,我們可以使用以下語法例項化它:
val obj = new MyClass()
或者我們可以簡單地寫:
val obj = new MyClass
但是,如果不注意,在某些情況下,可選括號可能會產生一些意想不到的行為。假設我們要建立一個應該在單獨的執行緒中執行的任務。以下是示例程式碼:
val newThread = new Thread { new Runnable {
override def run(): Unit = {
// perform task
println("Performing task.")
}
}
}
newThread.start // prints no output
我們可能認為這個示例程式碼如果被執行將列印 Performing task.
,但令我們驚訝的是,它不會列印任何東西。讓我們看看這裡發生了什麼。如果你仔細看看,我們在 new Thread
之後使用了花括號 {}
。它建立了一個擴充套件 Thread
的匿名類:
val newThread = new Thread {
//creating anonymous class extending Thread
}
然後在這個匿名類的主體中,我們定義了我們的任務(再次建立一個實現 Runnable
介面的匿名類)。所以我們可能認為我們使用了 public Thread(Runnable target)
建構函式,但事實上(通過忽略可選的 ()
)我們使用了 public Thread()
建構函式,並沒有在 run()
方法體中定義。為了解決這個問題,我們需要使用括號而不是花括號。
val newThread = new Thread ( new Runnable {
override def run(): Unit = {
// perform task
println("Performing task.")
}
}
)
換句話說,這裡 {}
和 ()
不可互換。