Scala方法执行顺序疑问:main方法外代码为何先执行?
为什么Scala代码中main方法外的代码先执行?
这是个很典型的Scala单例对象初始化顺序问题,我来给你拆解清楚:
首先看你写的代码:
object Maps { def main(args: Array[String]): Unit = { println("Hello") } def myMethod(myhash: Map[String, String]) = { for ((k, v) <- myhash) printf("key: %s, value: %s\n", k, v) } myMethod(Map("test1" -> "test2")) val m1 = Map[Int, Int](1 -> 1) for ((k, v) <- m1) printf("key: %s, value: %s\n", k, v) }
你提到输出顺序是:
key: test1, value: test2
key: 1, value: 1
Hello
核心原因:Scala单例对象的初始化逻辑
在Scala里,object是单例对象,当JVM启动并加载这个对象的时候,会先执行对象内部所有不在方法里的顶级代码,完成整个单例对象的初始化工作,之后才会去调用main方法作为程序的入口执行。
你代码里的这几部分都是顶级语句(不在任何方法内部):
myMethod(Map("test1" -> "test2"))val m1 = Map[Int, Int](1 -> 1)以及后续的for循环
这些代码会在main方法运行前,随着Maps单例对象的初始化被依次执行。而main方法里的println("Hello")是在整个对象初始化完成后才会被调用的,所以输出顺序才会和你预期的相反。
怎么修改才能让代码按预期顺序执行?
只需要把这些顶级语句移到main方法内部就可以了,修改后的代码如下:
object Maps { def main(args: Array[String]): Unit = { println("Hello") // 把原来的顶级代码移到main方法内 myMethod(Map("test1" -> "test2")) val m1 = Map[Int, Int](1 -> 1) for ((k, v) <- m1) printf("key: %s, value: %s\n", k, v) } def myMethod(myhash: Map[String, String]) = { for ((k, v) <- myhash) printf("key: %s, value: %s\n", k, v) } }
这样修改后,程序会先执行main方法里的println("Hello"),再依次执行后面的方法调用和循环,输出顺序就符合你的预期了。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

