Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala包对象构造函数_Scala - Fatal编程技术网

Scala包对象构造函数

Scala包对象构造函数,scala,Scala,何时以及如何调用Scala包对象构造函数 我有两门课: Package.scala package my; package object entities { //Some initialization code in constructor } 斯卡拉酒店 package my.entities; case class Classy { } 我试图让entities构造函数在创建Classy对象时已经执行。包对象被转换为一个名为package.class IIRC的普通java类文件

何时以及如何调用Scala包对象构造函数

我有两门课:

Package.scala

package my;
package object entities {
   //Some initialization code in constructor
}
斯卡拉酒店

package my.entities;
case class Classy {
}

我试图让entities构造函数在创建Classy对象时已经执行。

包对象被转换为一个名为package.class IIRC的普通java类文件。从那时起,我假设它的行为类似于任何普通Java类,因此它在第一次被引用时被加载和实例化。在Scala中,这意味着您需要在包对象中定义某种方法或
val
,然后从外部访问它。在您的情况下,您可以尝试从
Classy
的构造函数调用它,或者从实例化
Classy
的代码调用它

更新 好的,下面是我运行的一些代码,用于测试我上面描述的内容:

// 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
所示。

您可以尝试在package对象和case类的初始化中放置两个println,看看它们以什么顺序打印到屏幕上。实际上,“entities”构造函数根本不会被调用。我想知道,怎么称呼它。我假设它应该在创建或导入包类时自动调用…?它是在第一次使用时创建(并初始化)的。试着做val c=Classy。另请参见我创建了一个Classy对象,但它没有被调用。因为它是一个对象而不是一个类,构造函数不应该被自动调用吗?对象是惰性的。在使用它们之前,它们不会被实例化。我假设这同样适用于包对象。尝试使用(包)对象,应该调用构造函数。您的程序似乎副作用很大。你到底想干什么?这听起来很“危险”:PDoesn不是在包中创建类的对象,而是使用包对象?@0n4li,绝对不是。就术语而言,它们听起来好像是相关的,但包对象更像是在Scala中“模拟”自由(全局)函数的便利。如果考虑到这些的Java实现,很明显,驻留在包中的类/对象与相应的包对象之间没有隐式依赖关系。