如何在kotlin中实现finalize()?

gle*_*e8e 17 java finalize kotlin

今天我正在Closeablekotlin中实现一个,就像我过去在java中所做的那样,我希望finalize()在客户端代码忘记关闭它的情况下实现一个最后的回退,使得关键资源无法回收.尽管这种回退不可靠,但我认为这种资源至关重要,足以增加这种后备.但是,kotlin.Any没有声明一个finalize方法,这意味着我不能简单地这样做:

class Resource: Closeable {
    fun close() {}
    override fun finalize() { close()}
}
Run Code Online (Sandbox Code Playgroud)

这不好,至少没有它应该的那么好.现在我恢复普通Java作为解决方法.有谁知道如何在纯Kotlin中做到这一点?

PS:我目前的解决方法:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable {
    @Override protected void finalize() { close(); }
}
Run Code Online (Sandbox Code Playgroud)

科特林:

class Resource: FinalizedCloseable(), Closeable {
    fun close() {}
    override fun finalize() { close()}
}
Run Code Online (Sandbox Code Playgroud)

但是这种解决方法需要一个超类.如果下次我的其他人Resource已经有了一个超类,那么如果没有很多样板,这种解决方法将无法工作.


编辑:现在我知道如何实现finalize(),但IDEA kotlin插件不够聪明,不知道这是一个终结器,因此用一些警告标记它.经过一段时间的努力,我发现如何压制这些警告,我想分享它:

class C {
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
Run Code Online (Sandbox Code Playgroud)

zsm*_*b13 30

官方文件涵盖了这一点.

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

class C {
    protected fun finalize() {
        // finalization logic
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的,它可以工作,但是如何在其中调用`super.finilize()`呢?我反编译生成的java代码,那里没有超级调用。 (2认同)
  • @Boris是的,如果您扩展一个具有其代码的类。但是,当您扩展的类都没有覆盖它时,就不需要它了。但是,如果您扩展的类允许这样做,您应该能够调用“super.finalize”并且一切正常。 (2认同)