Kotlin / Native中的.freeze()是什么?

时间:2018-09-03 09:32:10

标签: kotlin kotlin-native

我在Kotlin / Native中看到了另一个功能,该功能在Kotlin JVM或JS中不存在。什么事啊

2 个答案:

答案 0 :(得分:6)

来自Kotlin native's Concurrency docs

  

冻结是一种运行时操作,通过修改对象标头使给定的对象子图不可变,以便将来进行更改尝试会引发InvalidMutabilityException。它很深,因此,如果一个对象具有指向另一个对象的指针-此类对象的传递闭包将被冻结。冻结是转换的一种方式,冻结的对象不能被冻结。冻结对象具有很好的属性,由于它们具有不变性,因此可以在多个工作程序/线程之间自由共享它们,而不会破坏“可变XOR共享”不变式。

答案 1 :(得分:1)

分享来自 Kotlin Multiplatform Mobile 文档的更新更简单的解释here

<块引用>

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 中找到它。