Kotlin编程语言中的析构函数

Rak*_*esh 11 destructor kotlin

我是Kotlin的新手,已经在kotlin写了一个类来执行数据库操作

我使用init在构造函数中定义了数据库连接,但我想使用析构函数关闭数据库连接.

有关如何使用kotlin析构函数实现此目的的任何想法?

目前我已经写了一个单独的函数来关闭连接,我希望它像使用任何其他编程语言一样使用析构函数,如php等

jrt*_*ell 11

处理需要在Kotlin关闭的资源

您可以扩展数据库包装器Closeable.然后你可以像这样使用它.

val result = MyResource().use { resource ->
    resource.doThing();
}
Run Code Online (Sandbox Code Playgroud)

这样在使用块内部您的资源将可用,之后您将返回结果,即返回结果doThing(),并且您的资源将被关闭.由于您尚未将其存储在变量中,因此也避免在资源关闭后意外使用该资源.

为什么要避免 finalize

Finalize不安全,描述了它们的一些问题,例如:

  • 它们不能保证完全运行
  • 当它们运行时,它可能会在运行之前出现延迟

该链接总结了这样的问题:

终结器是不可预测的,通常是危险的,并且通常是不必要的.它们的使用会导致不稳定的行为,性能不佳和可移植性问题.终结器有一些有效用途,我们将在本项后面介绍,但根据经验,你应该避免使用终结器.

提醒C++程序员不要将终结器视为Java的C++析构函数的类比.在C++中,析构函数是回收与对象关联的资源的常用方法,对象是构造函数的必要对应物.在Java中,垃圾收集器在它变得无法访问时回收与对象相关联的存储,而不需要程序员的特殊努力.C++析构函数也用于回收其他非内存资源.在Java中,try-finally块通常用于此目的.

如果你真的需要使用finalize

此链接显示如何覆盖最终化,但除非绝对必要,否则这是一个坏主意.

  • “它们根本不能保证运行”那只是因为程序可以退出。“Closeable”也存在同样的问题。没有任何东西会禁用操作系统的进程管理或计算机的电源按钮。 (4认同)
  • 如果 kotlin 类创建了一个在该类的整个生命周期中使用的资源,但必须在该类被垃圾收集之前显式释放,会发生什么情况。例如,“广播者”就是这种情况。 (2认同)