扩展App trait的对象内的字段设置为null.为什么会这样?

Gre*_*reg 8 scala scalatest

我正在尝试使用scalatest测试这样的应用程序:

object Main extends App {
    val name = "Greg"
}

class JunkTests extends FunSpec with MustMatchers {
    describe("Junk Tests") {
        it("Junk-1 -- Must do stuff") {
            println("Name: "+Main.name)
            // some test here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的名字输出始终为null.如何让我的主要对象在测试期间使用它的设施?在实际使用中我有一个应用程序,它是一个Http服务器,我想发送它的消息,但现在它从未初始化,所以服务器永远不会启动.这个简单的例子表明Main永远不会被初始化.

om-*_*nom 12

应该注意的是,这个特性是使用DelayedInit功能实现的,这意味着在执行main方法之前,对象的字段不会被初始化.

Scaladoc for App trait

所以你可以:

  • 将val定义为final: final val name = "Greg"
  • 在访问名称字段之前触发main方法
  • 将name定义为方法: def name = "Greg"
  • 将name定义为lazyval :( lazy val name = "Greg"所以在这种情况下,以及之前的,无论在哪个顺序初始化都完成)

  • 让 val 变得懒惰对我有用;使其最终化并没有改变行为。 (2认同)