2016-11-17 13 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

リフレクションを使用して、「Trait MyCallbackを実装するすべてのクラス」のリストを作成し、プログラムの起動時にリストに追加することができます。 形質を定義する必要があります(例:あなたの例の文脈では

sealed trait MyCallback { 
    def callback: Unit 
} 

ABCMyCallbackを延長するオブジェクト。反射コードの場合

、例えば Finding objects using scala's runtime reflectionため

関連する問題