Scala中最终var的用法是什么?

Era*_*dan 4 scala

final varScala中的用法是什么?什么是行为.有没有用例?

(另请参阅,为什么`private val`和`private final val`不同?,这非常接近,但不一样)

som*_*ytt 9

final 意义超载.

它可能意味着"无法覆盖子类",因此final var.

apm@mara:~$ skala -Yoverride-vars
Welcome to Scala version 2.11.0-20130811-132927-95a4d6e987 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait Foo { var v = 7 }
defined trait Foo

scala> trait Bar extends Foo { override var v = 8 }
defined trait Bar

scala> trait Foo { final var v = 7 }
defined trait Foo

scala> trait Bar extends Foo { override var v = 8 }
<console>:8: error: overriding variable v in class Foo$class of type Int;
 variable v cannot override final member
       trait Bar extends Foo { override var v = 8 }
                                            ^
Run Code Online (Sandbox Code Playgroud)

final val i = 7是一个常量值定义(也称为编译时间常量)但val i = 7不是,无论访问修饰符如何.

之前引用过这个,但是5.2规范:

final修饰符适用于类成员定义和类定义.最终的类成员定义可能不会在子类中重写.最终的类可能不会被模板继承.对于对象定义,final是多余的.最终类或对象的成员也是最终的,因此最终修饰符对于它们来说通常也是多余的.但请注意,常量值定义(第4.1节)确实需要显式的最终修饰符,即使它们是在最终类或对象中定义的.final可能不适用于不完整的成员,也可能不会合并到一个带密封的修饰符列表中.

和4.1

形式是常量值定义

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

其中e是常数表达式(§6.24).必须存在最终修饰符,并且不能给出类型注释.对常量值x的引用本身被视为常量表达式; 在生成的代码中,它们被定义的右侧e替换.

编辑:抱歉,没有注意到你特意没有询问.孩子们正准备睡觉,刷牙,所有这一切,有点分心.