3

Scala Package オブジェクト コンストラクターは、いつ、どのように呼び出されますか?

私は2つのクラスを持っています:

Package.scala

package my;
package object entities {
   //Some initialization code in constructor
}

Classy.scala

package my.entities;
case class Classy {
}

Classy のオブジェクトが作成されるまでに、エンティティ コンストラクターが既に実行されているようにしようとしています。

4

1 に答える 1

5

パッケージ オブジェクトは、 package.class IIRCと呼ばれる通常の Java クラス ファイルに変換されます。それ以降は、通常の Java クラスと同様に動作すると想定しているため、最初に参照されたときにロードされてインスタンス化されます。valScala では、何らかのメソッドまたはパッケージ オブジェクトを定義して、外部からアクセスする必要があることを意味します。あなたの場合、のコンストラクターからClassy、またはインスタンス化するコードから呼び出すことができますClassy

アップデート

OK、これは私が上で説明したことをテストするために実行したいくつかのコードです:

// package.scala
package some

package object pkg {
  println("package created!")

  def func() { println("func called") }
}

// C.scala
package some.pkg

class C {
  println("created C")
}

// G.scala
package some.pkg

object G {
  println("creating G")
  func()
  println("created G")
}

// PackageTester.scala
package some.pkg

object PackageTester extends App {
  val c = new C
  val g = G
}

出力は次のとおりです。

created C
creating G
package created!
func called
created G

これは、Scala パッケージ オブジェクトが実際に参照された場合にのみ遅延して作成されることを証明しています。実際、上記で示したように、「通常の」Scala オブジェクトについても同じことが言えますG

于 2012-12-29T10:54:56.193 に答える