Java 为什么当我进行单元测试时,我得到的覆盖点是'final lazy val',而不是'final val'?

Java 为什么当我进行单元测试时,我得到的覆盖点是'final lazy val',而不是'final val'?,java,scala,sbt,scalatest,Java,Scala,Sbt,Scalatest,我有一些代码(此处提供项目源代码-): 我正在使用ScalaTest和SBT覆盖率插件测试这段代码,如下所示: import org.scalatest.{FlatSpec,Matchers} class MainTest extends FlatSpec with Matchers { it should "have a name" in { Main.NAME shouldBe "foo" } } 但出于某种原因,我仅在表达式中包含

我有一些代码(此处提供项目源代码-):

我正在使用ScalaTest和SBT覆盖率插件测试这段代码,如下所示:

import org.scalatest.{FlatSpec,Matchers}

class MainTest extends FlatSpec with Matchers {
  it should "have a name" in {
    Main.NAME shouldBe "foo"
  }
}
但出于某种原因,我仅在表达式中包含
惰性
修饰符时获得覆盖点:


为什么会出现这种情况?

我猜coverage工具会统计执行的行数

final val NAME=“foo”
在字节码中编译为常量内联值,如Java中的
private static final
。访问变量时,只需从字节码常量中读取值


另一方面,
final lazy val NAME=“foo”
编译为惰性构造方法,因为JVM中没有惰性值。如果访问此变量,将执行惰性构造方法

val
s已经是final了,所以你不应该需要
final
修饰符。@SteveChaloner:不,任何人都可以覆盖类的
val
,所以
val
通常不是
final
。@senia我想的是
对象(不能覆盖),但很好。
final val
(没有显式返回类型)是Scala中的编译时常量,它在运行时不存在,因此对覆盖率没有任何影响。@nmurthy是的。我修复了我的打字错误
var
在这种上下文中没有意义
import org.scalatest.{FlatSpec,Matchers}

class MainTest extends FlatSpec with Matchers {
  it should "have a name" in {
    Main.NAME shouldBe "foo"
  }
}