scala - Scala构造函数上的“发生在之前”:最终字段
问题描述
Java 规范提到,只有final
字段的类的构造函数与读取对该对象的任何引用的任何线程处于发生前关系:换句话说,应用程序不可能看到部分构造的对象。
Scala 通过将初始化提取到单独的方法来破解初始化,以确保在超类中的任何初始化代码之前设置“主构造函数 vals” 。这至少是 Scalafinal val
不总是(或永远?)翻译成 Javafinal
领域的原因之一。
- 有没有办法实现这一点,即确保类客户端及其构造函数之间的发生前关系?
- 哪个是编译器相当稳定的功能?
- 一个不是用Java编写类的?
解决方案
Scala 通过将初始化提取到单独的方法来破解初始化,以确保在超类中的任何初始化代码之前设置“主构造函数 vals” 。
final
在java中,只要this
不从构造函数中逃脱就不会破坏保证。
(“不转义”意味着构造函数的代码不存储this
在另一个线程可以读取的变量/集合/等中)
另外因为 JMM 是为 java 语言而不是 JVM 定义的,恐怕它只适用于编译为 java 代码的语言。
推荐阅读
- flutter - 在同一属性上颤动交错动画
- json - 创建或更新 AAD 列表
- c# - 如何修复该方法以便他们处理列表?
- node.js - 节点js传递/发送post数据到html
- javascript - 无法理解 Cloud Function Error
- android-studio - 如何在水平布局/滚动视图中分离图像?
- c - 使用 winsock2.h 的问题
- java - 如何自动化新的 Facebook 注册弹出窗口?
- azure - 无法在 .net 框架中的 Azure 函数应用中绑定参数“lockToken”?
- pdf - com.itextpdf.kernel.PdfException:文档已关闭。无法执行动作