今天我在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() {}
}
答案 0 :(得分:24)
official documentation涵盖了此内容。
要覆盖finalize(),您只需要声明它,而不使用override关键字:
class C {
protected fun finalize() {
// finalization logic
}
}