Scala构造函数参数和类/特征/对象成员的final含义

ned*_*dim 1 constructor scala final

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

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
}
Run Code Online (Sandbox Code Playgroud)

根据编译器输出判断(只有两条标记的行导致错误),finalfinal vals和vars 之间没有区别- 这是正确的吗?我通过运行这个例子验证了除了intVal和之外的所有变量finalIntVal都被修改了.

相关问题RQ1:final作为层次结构一部分的类的构造函数是否有任何意义?

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

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

Jör*_*tag 7

A val不能改变.然而,A val 可以被覆盖,所以即使你看到val某个地方,你也无法确定它的价值.(在一般情况下,很难判断成员是否被覆盖.这称为类层次结构分析,相当于解决暂停问题.)

final val但是,A 无法更改且无法覆盖,因此您知道它的值永远不会与初始化的值不同.构造函数参数使用类注释varval成为类的成员,因此final val对于构造函数参数实际上与"普通"类/特征/对象成员或多或少相同.

请注意,对于(非构造函数)成员宣布恰好是这样的:

final val foo = e
Run Code Online (Sandbox Code Playgroud)

即使用显式 final修饰符(即使val它是隐式最终的,例如因为它在一个final类内或在一个内部object),没有类型注释,并且where e是一个常量表达式,声明成为一个常量值声明,Scala语言规范保证由编译器优化.