问题描述
我试图了解 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)
解决方法
如果您查看使用 lazy
的 SynchronizedLazyImpl
委托的实现,您会看到一旦计算出该值,初始化 lambda 就被设置为 null:
val typedValue = initializer!!()
_value = typedValue
initializer = null
所以通过这一行:
user.x.doStuff()
FooFactory
符合垃圾收集条件。但是,如果 x
从未被访问过,那么 FooFactory
只会在包含 User
的对象被垃圾回收后才会被垃圾回收。