如何在 kotlin 中实现 finalize()?

How to implement finalize() in kotlin?

今天我在 kotlin 中实现了一个 Closeable,就像我过去在 java 中所做的那样,我想实现一个 finalize() 作为最后的回退万一客户端代码忘记关闭它,导致关键资源未回收。我认为这个资源足够重要,可以添加这个回退,尽管这个回退不可靠。但是,kotlin.Any 没有声明 finalize 方法,这意味着我不能简单地这样做:

class Resource: Closeable {
    fun close() {}
    override fun finalize() { close()}
}

这不好,至少没有达到应有的水平。现在我恢复为纯 Java 作为解决方法。有谁知道如何在纯 Kotlin 中做到这一点?

PS:我目前的解决方法:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable {
    @Override protected void finalize() { close(); }
}

科特林:

class Resource: FinalizedCloseable(), Closeable {
    fun close() {}
    override fun finalize() { close()}
}

但是这个解决方法需要一个超类。如果下次我的另一个 Resource 已经有了一个超类,那么如果没有大量样板文件,这个解决方法将无法工作。


编辑:现在我知道如何实现 finalize(),但是 IDEA kotlin 插件不够智能,无法知道这是一个终结器,因此用一些警告标记它。折腾了半天终于找到了如何抑制这些警告,分享一下:

class C {
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}

official documentation 涵盖了这一点。

To override finalize(), all you need to do is simply declare it, without using the override keyword:

class C {
    protected fun finalize() {
        // finalization logic
    }
}