28

Javaの静的ブロックに相当するScalaとは何ですか?

4

1 に答える 1

38

コンパニオンオブジェクトのコンストラクター(つまり、本体)のコードは、Javaクラスの静的初期化ブロックのコードと正確に同じではありません。以下の例では、Aのインスタンスを作成していますが、初期化は行われません。

scala> object Test { class A; object A { println("A.init") }}        
defined module Test

scala> new Test.A
res3: Test.A = Test$A@3b48a8e6

scala> Test.A
A.init
res4: Test.A.type = Test$A$@6e453dd5

クラスの最初のインスタンスが作成されたときにコンパニオンオブジェクトの構築をトリガーするには、クラスコンストラクターからそれにアクセスできます。

scala> object Test { class A { A }; object A { println("A.init") }}
defined module Test

scala> new Test.A                                                  
A.init
res5: Test.A = Test$A@4e94a28e

scala> new Test.A
res6: Test.A = Test$A@30227d4e

多くの場合、違いは重要ではありません。しかし、ミサイル(または他の副作用)を発射する場合は、気にするかもしれません!

于 2010-02-27T12:05:25.027 に答える