Scala 构造函数参数和 class/trait/object 成员的 final 的含义

Meaning of final for Scala constructor arguments and class/trait/object members

final 对 Scala 构造函数参数意味着什么?我有这个例子:

class IntFinalTest(
    val intVal: Int,
    final val finalIntVal: Int,
    var intVar: Int,
    final var finalIntVar: Int) {
  //  intVal = 3 // error: reassignment to val
  //  finalIntVal = 3 // error: reassignment to val
  intVar = 3
  finalIntVar = 3
}

class ArrayFinalTest(
    val arrayVal: Array[Int],
    final val finalArrayVal: Array[Int],
    var arrayVar: Array[Int],
    final var finalArrayVar: Array[Int]) {
  arrayVal(0) = 3
  finalArrayVal(0) = 3
  arrayVar(0) = 3
  finalArrayVar(0) = 3
}

从编译器输出来看(只有标记的那两行导致错误),final和非finalval和[=16之间没有区别=]s - 这是正确的吗?我已经通过 运行 这个例子验证了除了 intValfinalIntVal 之外的所有变量都被修改了。

相关问题 RQ1final 在属于层次结构的 class 的构造函数中有任何意义吗?

相关问题 RQ2:如何创建不可变 Array[Int] class 成员(如果它是构造函数参数列表的一部分)?

上下文:我使用 Scala 2.10.5,并且只有几个月的使用经验。

A val 无法更改。但是 val 可以 被覆盖,所以即使你在某处看到 val ,你也不能确定它的值。 (在一般情况下,很难判断一个成员是否被覆盖。这就是所谓的Class层次结构分析,相当于解决Halting Problem。)

A final val,但是无法更改也无法覆盖,因此您知道它的值永远不会与初始化时的值不同。用 varval 注释的构造函数参数成为 class 的成员,因此 final val 对于构造函数参数实际上意味着或多或少与它所做的相同"normal" class/trait/object 成员。

请注意,对于(非构造函数)成员声明 完全 如下所示:

final val foo = e

即使用 explicit final 修饰符(即使 val 隐含最终,例如因为它在 final class 或在 object) 中, 没有 类型注释,其中 e 是 Scala 语言规范保证由编译器优化的 constant expression, the declaration becomes a constant value declaration .