7

我在 Kotlin/Native 中看到了另一个函数,它在 Kotlin JVM 或 JS 中不存在。它有什么作用?

4

2 回答 2

8

来自Kotlin native 的并发文档

冻结是一种运行时操作,通过修改对象标头使给定的对象子图不可变,以便将来的变异尝试导致抛出 InvalidMutabilityException。它很深,所以如果一个对象有一个指向另一个对象的指针——这些对象的传递闭包将被冻结。冻结是单向变换,冻结的对象无法解冻。冻结对象有一个很好的属性,由于它们的不变性,它们可以在多个工作人员/线程之间自由共享,而不会破坏“可变异或共享”不变量。

于 2018-09-03T09:35:03.247 回答
1

在这里分享来自 Kotlin Multiplatform Mobile 文档的更新更简单的解释:

Native 运行时为所有类添加了一个扩展函数 freeze()。调用 freeze() 将递归地冻结对象以及对象引用的所有内容。例如:

data class MoreData(val strData: String, var width: Float)
data class SomeData(val moreData: MoreData, var count: Int)
//...
val sd = SomeData(MoreData("abc", 10.0), 0)
sd.freeze()

  • freeze() 是一种单向操作。你不能解冻某些东西。
  • freeze() 在共享的 Kotlin 代码中不可用,但一些库提供了在共享代码中使用它的期望和实际声明。但是,如果您使用的是并发库,例如 kotlinx.coroutines,它可能会自动冻结跨线程边界的数据。
  • freeze 并不是 Kotlin 独有的。您也可以在 Ruby 和 JavaScript 中找到它。
于 2021-06-19T01:24:39.637 回答