Kotlin 中构造函数参数的生命周期

Lifecycle of constructor parameters in Kotlin

我想了解 Kotlin 中构造函数参数的生命周期。 给定以下代码,FooFactory class 实例何时可用于垃圾收集器收集?

既然FooFactory的使用延迟了,runtime会知道什么时候释放吗?

或者,如果编译器不知道何时释放,这是否会造成泄漏 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)

如果您查看使用 SynchronizedLazyImpllazy 委托的实现,您将看到在计算值后立即将初始化 lambda 设置为 null:

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

所以通过这一行:

user.x.doStuff()

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