如果传递的对象捕获了包含“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.Cleanerregister方法已经存在,而且没有这样的注解。

在 Android 中,有一个与 android.os.AsyncTask 类似的注释,但它只是警告任何以 AsyncTask 作为基础的匿名对象 class,它是否捕获this 与否。 (这在 Java 中有意义,其中匿名 classes 总是捕获 this,但在 Kotlin 中则不然。)