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
和非final
val
和[=16之间没有区别=]s - 这是正确的吗?我已经通过 运行 这个例子验证了除了 intVal
和 finalIntVal
之外的所有变量都被修改了。
相关问题 RQ1:final
在属于层次结构的 class 的构造函数中有任何意义吗?
相关问题 RQ2:如何创建不可变 Array[Int]
class 成员(如果它是构造函数参数列表的一部分)?
上下文:我使用 Scala 2.10.5,并且只有几个月的使用经验。
A val
无法更改。但是 val
可以 被覆盖,所以即使你在某处看到 val
,你也不能确定它的值。 (在一般情况下,很难判断一个成员是否被覆盖。这就是所谓的Class层次结构分析,相当于解决Halting Problem。)
A final val
,但是无法更改也无法覆盖,因此您知道它的值永远不会与初始化时的值不同。用 var
或 val
注释的构造函数参数成为 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 .
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
和[=16之间没有区别=]s - 这是正确的吗?我已经通过 运行 这个例子验证了除了 intVal
和 finalIntVal
之外的所有变量都被修改了。
相关问题 RQ1:final
在属于层次结构的 class 的构造函数中有任何意义吗?
相关问题 RQ2:如何创建不可变 Array[Int]
class 成员(如果它是构造函数参数列表的一部分)?
上下文:我使用 Scala 2.10.5,并且只有几个月的使用经验。
A val
无法更改。但是 val
可以 被覆盖,所以即使你在某处看到 val
,你也不能确定它的值。 (在一般情况下,很难判断一个成员是否被覆盖。这就是所谓的Class层次结构分析,相当于解决Halting Problem。)
A final val
,但是无法更改也无法覆盖,因此您知道它的值永远不会与初始化时的值不同。用 var
或 val
注释的构造函数参数成为 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 .