Java内存模型(自1.5开始)将final
字段与非final
字段区别对待。特别是,如果this
引用在构造期间没有转义,则构造函数中对final
字段的写入保证在其他线程上可见,即使该对象通过另一个线程可用于其他线程数据竞赛。 (写入非final
字段不保证是可见的,因此如果您不正确地发布它们,另一个线程可能会看到它们处于部分构造状态。)
是否有关于Scala编译器如何/如果为类创建final
(而非非final
)支持字段的文档?我查看了语言规范并搜索了网络,但找不到任何确定的答案。 (相比之下,记录了@scala.volatile
注释 以将字段标记为volatile
)
答案 0 :(得分:4)
答案 1 :(得分:3)
当您将某些内容声明为final
时,它会创建一个val
字段。任何可以修改其引用的内容(例如var
)都可以(显然)不在final
下面。
这意味着case classes
也包含final字段(因为case类构造函数的参数是隐式的val
s)
答案 2 :(得分:2)
我在Scala bug系统中为此提交了文档错误。