我知道在多行中拆分包声明会创建一个隐式导入。所以这个:
package com.me.project
package module
等于:
package com.me.project.module
import com.me.project._
但是,如果project
包中的对象发生更改,是否会触发sbt
重新编译当前文件,还是取决于是否在当前范围内实际调用了更改后的对象?基本上,我想知道是否更明确,例如:
package com.me.project.module
import com.me.project.UtilClass
import com.me.project.Rng
与前两种方法相比,有助于加快编译时间吗?
答案 0 :(得分:1)
不,加速任何事都没有用。实际上,这可能意味着您的编译时间甚至会增加,因为执行单个导入意味着编译器必须解析更多行代码。但是因为那仍然只需要几纳秒就不算数了。
导入声明只不过是编译器有关查找声明位置的信息。除非您从代码中引用它,否则编译器不需要对该信息执行任何操作。在这种情况下,编译器也必须编译该文件,以便能够确定您的代码是否会出现类型错误。
换句话说,如果你实际上使用了一组数百个中的两个声明,那么它们是唯一会在源代码发生变化时触发重新编译的声明。
我没有说这是唯一可能的行为,因为它可以以任何方式实现,但是当与导入声明对应的代码发生更改时,它会以触发重新编译代码的方式实现编译器没有多大意义,当你想到它时,这就是为什么它肯定会说它不会这样做的原因。因为,会发生什么?每个源文件可能包含一个包声明和一些导入。如果您的代码被重新编译,因为通配符导入范围中的一个声明更改,那么所有其他文件也需要这样做。并且因为您可以确定在每个应用程序中所有现有导入都或多或少地跨越整个类路径,所以需要重新编译整个类路径,因为一个文件已更改,这不是所需的行为。