2016-11-17 37 views
0

在C++中,可以通過靜態成員實現具有靜態註冊回調的調度器回調模式。然而,在Scala中,所有對象都被懶惰地初始化了,所以下面的代碼在C++中並不是真正的類似的東西。如何在Scala中靜態註冊回調?

object Main { 
    var callbacks = List[()=>Unit]() 
    def main(args: Array[String]): Unit = { 
     println("hello") 
     callbacks.foreach { _() } 
    } 
} 
object A { 
    val callbackA =() => println("A") 
    Main.callbacks = callbackA::Main.callbacks 
} 
object B { 
    val callbackB =() => println("B") 
    Main.callbacks = callbackB::Main.callbacks 
} 
object C { 
    val callbackC =() => println("C") 
    Main.callbacks = callbackC::Main.callbacks 
} 

當運行該程序中,沒有回調被調用時,因爲對象A,B,和C被從未初始化和註冊被從未執行。 Scala中有沒有一種方法可以正確實現我在這裏的目標?

+1

中的代碼A'''B'和'C'實際上是永遠不會運行。所以你的'main'方法只是用'foreach'迭代一個空集合。我不確定你的意圖是什麼。 – PermaFrost

+0

@PermaFrost假設類似的東西是用C++和Java編寫的,它們會起作用。我想知道是否有可能在Scala中做同樣的事情。具體而言,我希望在調度員不知道他們存在的情況下注冊回調。就像LLVM通行證如何註冊一樣。 – uraj

+0

也許你應該證明你會如何用Java編寫它。 Java的靜態成員也被懶惰地初始化了。 –

回答

3

在程序啓動時,您可以使用反射來創建「實現特徵MyCallback的所有類」的列表並將它們添加到列表中。 你必須定義一個特徵,例如

sealed trait MyCallback { 
    def callback: Unit 
} 

在您的例子的情況下,對象ABC將延長MyCallback

對於反射代碼,例如見Finding objects using scala's runtime reflection