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

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)

Nic*_*las 5

如果查看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对象被垃圾回收后才会被垃圾回收。