如何在 kotlin 中实现 finalize()?
How to implement finalize() in kotlin?
今天我在 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() {}
}
official documentation 涵盖了这一点。
To override finalize(), all you need to do is simply declare it, without using the override keyword:
class C {
protected fun finalize() {
// finalization logic
}
}
今天我在 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() {}
}
official documentation 涵盖了这一点。
To override finalize(), all you need to do is simply declare it, without using the override keyword:
class C {
protected fun finalize() {
// finalization logic
}
}