今天我在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(); }
}
Kotlin:
class Resource: FinalizedCloseable(), Closeable {
fun close() {}
override fun finalize() { close()}
}
但这种解决方法需要一个超类。如果下一次我的其他Resource
已经有一个超类,那么使用这种解决方法将需要大量的样板文件。
编辑:现在我知道如何实现finalize(),但IDEA kotlin插件不够聪明,无法知道这是一个finalizer,因此没有标记它并发出警告。经过一番挣扎,我找到了如何抑制这些警告,并且想分享一下:
class C {
@Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
native
代码直接处理系统资源,否则你的类将成为另一个实际表示资源并让包装器的可达性决定实际资源(可能仍然可达和正在使用)寿命的对象的包装器,这意味着会出现严重问题... - HolgerFinalizeThis::finalize
从未被调用过。 - glee8e