首页 > 解决方案 > Scala构造函数上的“发生在之前”:最终字段

问题描述

Java 规范提到,只有final字段的类的构造函数与读取对该对象的任何引用的任何线程处于发生前关系:换句话说,应用程序不可能看到部分构造的对象。

Scala 通过将初始化提取到单独的方法来破解初始化,以确保在超类中的任何初始化代码之前设置“主构造函数 vals” 。这至少是 Scalafinal val不总是(或永远?)翻译成 Javafinal领域的原因之一。

  1. 有没有办法实现这一点,即确保类客户端及其构造函数之间的发生前关系?
  2. 哪个是编译器相当稳定的功能?
  3. 一个不是用Java编写类的?

标签: scalafinaljava-memory-modelhappens-before

解决方案


Scala 通过将初始化提取到单独的方法来破解初始化,以确保在超类中的任何初始化代码之前设置“主构造函数 vals” 。

final在java中,只要this不从构造函数中逃脱就不会破坏保证。
(“不转义”意味着构造函数的代码不存储this在另一个线程可以读取的变量/集合/等中)

另外因为 JMM 是为 java 语言而不是 JVM 定义的,恐怕它只适用于编译为 java 代码的语言。


推荐阅读