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

时间:2015-09-09 16:45:51

标签: scala constructor final

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和非final valvar之间没有区别s - 这是对的吗?我已通过运行此示例验证了除intValfinalIntVal之外的所有变量都已修改。

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

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

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

1 个答案:

答案 0 :(得分:7)

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

但是final val无法更改且无法覆盖,因此您知道它的值永远不会与初始化的值不同。使用varval注释的构造函数参数成为类的成员,因此构造函数参数的final val实际上与&#34的含义大致相同;正常" class / trait / object member。

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

final val foo = e

即。使用显式 final修饰符(即使val隐含最终,例如因为它位于final类内或object内),没有类型注释,econstant expression,声明变为constant value declaration,Scala语言规范保证由编译器优化