如何在 kotlin 中实现 finalize()?

2022-09-01 04:29:45

今天,我正在 kotlin 中实现一个,就像我过去在 java 中所做的那样,我想实现一个作为最后的手段回退,以防客户端代码忘记关闭它,从而导致关键资源未回收。我认为此资源对于添加此回退至关重要,尽管此回退不可靠。但是,不声明方法,这意味着我不能简单地这样做:Closeablefinalize()kotlin.Anyfinalize

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

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

PS:我目前的解决方法:

已定稿可关闭.java:

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

Kotlin:

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

但此解决方法需要一个超类。如果下次我的另一个人已经得到了一个超类,如果没有大量的样板,这个解决方法将不起作用。Resource


编辑:现在我知道如何实现finalize(),但是IDEA kotlin插件不够聪明,不知道这是一个终结器,因此用一些警告标记它。在挣扎了一会儿之后,我发现了如何抑制这些警告,我想分享一下:

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

答案 1

官方文档涵盖了这一点。

要覆盖finize(),您需要做的就是简单地声明它,而无需使用overable关键字:

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

答案 2

推荐