如果传递的对象捕获了包含“this”的对象,是否有注释会触发警告?
Is there an annotation that triggers a warning if an object is passed that captures enclosing ‘this’?
我有一个带有此签名的 Kotlin 函数:
fun registerDisposer(obj: Any, disposer: Closeable)
该函数所做的是将 disposer
附加到一个幻象引用,并安排它在 obj
被垃圾回收时关闭(即当幻象引用对象入队时)。 obj
的 class 应该这样称呼它:
class Holder(private val res1: Closeable, private val res2: Closeable) {
init {
registerDisposer(this, object: Closeable {
private val res1 = this@Holder.res1
private val res2 = this@Holder.res2
override fun close() {
res1.close()
res2.close()
}
})
}
}
(让我们忽略依赖一般 Closeable
是否是个好主意;所讨论的 actual 资源是由 [=32 管理的指针=] 代码——我正在尝试遵循 Hans Boehm’s advice。但所有这些与这个问题都不是特别相关。)
我担心这种设计很容易无意中传递一个从外部范围捕获 this
的对象,从而创建引用循环并完全阻止对象被垃圾收集:
registerDisposer(this, Closeable {
this.res1.close()
this.res2.close()
})
我可以在 disposer
参数中添加注释以在这种情况下触发警告吗?
截至撰写本文时,答案似乎是:可能不会。
原来registerDisposer
函数作为java.lang.ref.Cleaner
的register
方法已经存在,而且没有这样的注解。
在 Android 中,有一个与 android.os.AsyncTask
类似的注释,但它只是警告任何以 AsyncTask
作为基础的匿名对象 class,它是否捕获this
与否。 (这在 Java 中有意义,其中匿名 classes 总是捕获 this
,但在 Kotlin 中则不然。)
我有一个带有此签名的 Kotlin 函数:
fun registerDisposer(obj: Any, disposer: Closeable)
该函数所做的是将 disposer
附加到一个幻象引用,并安排它在 obj
被垃圾回收时关闭(即当幻象引用对象入队时)。 obj
的 class 应该这样称呼它:
class Holder(private val res1: Closeable, private val res2: Closeable) {
init {
registerDisposer(this, object: Closeable {
private val res1 = this@Holder.res1
private val res2 = this@Holder.res2
override fun close() {
res1.close()
res2.close()
}
})
}
}
(让我们忽略依赖一般 Closeable
是否是个好主意;所讨论的 actual 资源是由 [=32 管理的指针=] 代码——我正在尝试遵循 Hans Boehm’s advice。但所有这些与这个问题都不是特别相关。)
我担心这种设计很容易无意中传递一个从外部范围捕获 this
的对象,从而创建引用循环并完全阻止对象被垃圾收集:
registerDisposer(this, Closeable {
this.res1.close()
this.res2.close()
})
我可以在 disposer
参数中添加注释以在这种情况下触发警告吗?
截至撰写本文时,答案似乎是:可能不会。
原来registerDisposer
函数作为java.lang.ref.Cleaner
的register
方法已经存在,而且没有这样的注解。
在 Android 中,有一个与 android.os.AsyncTask
类似的注释,但它只是警告任何以 AsyncTask
作为基础的匿名对象 class,它是否捕获this
与否。 (这在 Java 中有意义,其中匿名 classes 总是捕获 this
,但在 Kotlin 中则不然。)