You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Java迁移到Kotlin时重写finalize()方法遇super.finalize()调用报错

在Kotlin中正确实现finalize()方法的解决方案

嘿,我来帮你搞定这个Java转Kotlin时遇到的finalize问题!

首先得明确一点:Kotlin对finalize()的处理和Java有不少差异,而且不管是Java还是Kotlin,finalize()现在都已经是废弃状态了(因为它的执行不可靠、性能差,还容易引发内存泄漏),不过如果你确实需要兼容旧逻辑,咱们来一步步解决:

为什么你之前的代码会报错?

在Kotlin中,Any类(对应Java的Object)的finalize()方法虽然存在,但编译器不允许你显式调用super.finalize()——它会自动帮你插入这个父类调用,所以你写super.finalize()的时候IDE就会提示“未解析的引用”。

另外,Kotlin默认所有类都是final的,在final类里定义protected方法会触发IDE警告,这就是第二种方案里需要加@Suppress("ProtectedInFinal")的原因。

正确的实现代码

下面是可以正常运行的Kotlin版本,同时加上必要的注解来抑制警告和标记废弃:

@Suppress("ProtectedInFinal", "DeprecatedCallableAddReplaceWith")
@Deprecated(message = "Finalizers are deprecated and will be removed in a future release")
protected fun finalize() {
    stopTimer()
    // 这里不需要写super.finalize(),编译器会自动帮你调用父类的finalize
}

更推荐的替代方案

既然你在做Java到Kotlin的迁移,强烈建议你放弃finalize(),改用更可靠的资源管理方式:

  • Kotlin的use函数:对应Java的try-with-resources,适合管理实现了Closeable/AutoCloseable的资源
  • Java 9+的Cleaner类:这是官方推荐用来替代finalize()的工具类,比finalize更可靠、性能更好

比如用use函数管理定时器资源的示例:

class TimerHolder : Closeable {
    private val timer = Timer()

    fun startTimer() {
        timer.scheduleAtFixedRate(...)
    }

    override fun close() {
        timer.cancel()
    }
}

// 使用的时候
TimerHolder().use { holder ->
    holder.startTimer()
    // 逻辑执行完后,会自动调用close()释放资源
}

内容的提问来源于stack exchange,提问作者Sigmund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:09:04