UrK*_*UrK 3 lifecycle constructor garbage-collection kotlin
我试图了解 Kotlin 中构造函数参数的生命周期。给定以下代码,FooFactory垃圾收集器何时可以收集类实例?
既然FooFactory延迟了使用,运行时会知道什么时候释放它吗?
或者如果编译器不知道何时发布FooFactory并且它将永远存在,这会造成泄漏吗?
class Foo {
fun doStuff() {}
}
class FooFactory {
fun getFoo() : Foo {
return Foo()
}
}
class User(factory: FooFactory) {
val x: Foo by lazy {
factory.getFoo()
}
}
val user = User(FooFactory())
Thread.sleep(100)
user.x.doStuff()
Thread.sleep(100)
Run Code Online (Sandbox Code Playgroud)
如果查看lazy使用的委托的实现SynchronizedLazyImpl,您会看到在计算值后初始化 lambda 被设置为 null:
val typedValue = initializer!!()
_value = typedValue
initializer = null
Run Code Online (Sandbox Code Playgroud)
所以通过这一行:
user.x.doStuff()
Run Code Online (Sandbox Code Playgroud)
FooFactory有资格进行垃圾收集。但是,如果x从未访问过,则FooFactory只有在包含User对象被垃圾回收后才会被垃圾回收。
| 归档时间: |
|
| 查看次数: |
33 次 |
| 最近记录: |