在scala对象中声明val与函数不同

时间:2015-10-21 15:58:36

标签: scala

此代码导致system为“null:

object Main extends App {

  val system = ActorSystem("mySystem")

  override def main(args: Array[String]): Unit = {

    println("Done")
  } 
}

但是如果我将system的声明移到main中,它就会被正确初始化。那是为什么?

1 个答案:

答案 0 :(得分:5)

来自documentation of App(强调我的):

  

注意事项

     

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

     

还应该注意 main方法不应该被覆盖:整个类体成为“主要方法”。

只做

object Main extends App {
  val system = ActorSystem("mySystem")  
  println("Done")
}

object Main {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("mySystem")
    println("Done")
  }
}