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