如何在kotlin中实现finalize()?

时间:2017-05-04 13:24:40

标签: java kotlin finalize

今天我在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() {}
}

1 个答案:

答案 0 :(得分:24)

official documentation涵盖了此内容。

  

要覆盖finalize(),您只需要声明它,而不使用override关键字:

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