0

我有一个带有这个签名的 Kotlin 函数:

fun registerDisposer(obj: Any, disposer: Closeable)

该函数所做的是附加disposer到一个幻像引用并安排它在obj垃圾收集时关闭(即当幻像引用对象入队时)。的类obj应该这样称呼它:

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(让我们忽略使用 general s依赖 this 是否是一个好主意;有问题的实际资源是由本机/JNI 代码管理的指针——我正在尝试遵循Hans Boehm 的建议。但所有这些都与这个问题。)

我担心这种设计很容易无意中传递this从外部范围捕获的对象,创建引用循环并完全防止对象被垃圾收集:

registerDisposer(this, Closeable {
    this.res1.close()
    this.res2.close()
})

有没有我可以添加到disposer参数中的注释,在这种情况下会触发警告?

4

1 回答 1

0

在撰写本文时,答案似乎是:可能不是。

事实证明,一个registerDisposer函数已经作为 的register方法存在java.lang.ref.Cleaner,并且它没有这样的注释。

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

于 2021-01-25T13:17:52.990 回答