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
val
和var
之间没有区别s - 这是对的吗?我已通过运行此示例验证了除intVal
和finalIntVal
之外的所有变量都已修改。
相关问题RQ1 :final
在作为层次结构一部分的类的构造函数中是否有任何意义?
相关问题RQ2 :如果它是构造函数参数列表的一部分,如何创建不可变Array[Int]
类成员?
上下文:我使用Scala 2.10.5并且只有几个月的经验。
答案 0 :(得分:7)
无法更改val
。然而,val
可以被覆盖,因此,即使您在某个地方看到val
,您也无法确定其价值。 (在一般情况下,很难判断成员是否被覆盖。这称为类层次结构分析,相当于解决暂停问题。)
但是final val
无法更改且无法覆盖,因此您知道它的值永远不会与初始化的值不同。使用var
或val
注释的构造函数参数成为类的成员,因此构造函数参数的final val
实际上与&#34的含义大致相同;正常" class / trait / object member。
请注意,对于(非构造函数)成员,声明完全,如下所示:
final val foo = e
即。使用显式 final
修饰符(即使val
隐含最终,例如因为它位于final
类内或object
内),没有类型注释,e
是constant expression,声明变为constant value declaration,Scala语言规范保证由编译器优化