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)
根据编译器输出判断(只有两条标记的行导致错误),final非final vals和vars 之间没有区别- 这是正确的吗?我通过运行这个例子验证了除了intVal和之外的所有变量finalIntVal都被修改了.
相关问题RQ1:final作为层次结构一部分的类的构造函数是否有任何意义?
相关问题RQ2:Array[Int]如果它是构造函数参数列表的一部分,如何创建不可变类成员?
上下文:我使用Scala 2.10.5,只有几个月的经验.
A val不能改变.然而,A val 可以被覆盖,所以即使你看到val某个地方,你也无法确定它的价值.(在一般情况下,很难判断成员是否被覆盖.这称为类层次结构分析,相当于解决暂停问题.)
final val但是,A 无法更改且无法覆盖,因此您知道它的值永远不会与初始化的值不同.构造函数参数使用类注释var或val成为类的成员,因此final val对于构造函数参数实际上与"普通"类/特征/对象成员或多或少相同.
请注意,对于(非构造函数)成员宣布恰好是这样的:
final val foo = e
Run Code Online (Sandbox Code Playgroud)
即使用显式 final修饰符(即使val它是隐式最终的,例如因为它在一个final类内或在一个内部object),没有类型注释,并且where e是一个常量表达式,声明成为一个常量值声明,Scala语言规范保证由编译器优化.