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)

解决方法

如果您查看使用 lazySynchronizedLazyImpl 委托的实现,您会看到一旦计算出该值,初始化 lambda 就被设置为 null:

val typedValue = initializer!!()
_value = typedValue
initializer = null

所以通过这一行:

user.x.doStuff()

FooFactory 符合垃圾收集条件。但是,如果 x 从未被访问过,那么 FooFactory 只会在包含 User 的对象被垃圾回收后才会被垃圾回收。