Kotlin程序设计语言中的析构函数

Kotlin程序设计语言中的析构函数,kotlin,destructor,Kotlin,Destructor,我是Kotlin的新手,在Kotlin中编写了一个类来执行数据库操作 我已经使用init在构造函数中定义了数据库连接,但我想使用析构函数关闭数据库连接 你知道如何使用kotlin析构函数来实现这一点吗 目前我已经编写了一个单独的函数来关闭连接,我想让它像php等任何其他编程语言一样使用析构函数来处理需要在Kotlin中关闭的资源 您可以使数据库包装器扩展。你可以这样使用它 val result = MyResource().use { resource -> resource.do

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

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

你知道如何使用kotlin析构函数来实现这一点吗


目前我已经编写了一个单独的函数来关闭连接,我想让它像php等任何其他编程语言一样使用析构函数来处理需要在Kotlin中关闭的资源 您可以使数据库包装器扩展。你可以这样使用它

val result = MyResource().use { resource ->
    resource.doThing();
}
这样,在use块中,您的资源将可用,之后您将返回结果,
doThing()
返回的结果,并且您的资源将被关闭。由于没有将其存储在变量中,因此也可以避免在资源关闭后意外使用该资源

为什么要避免
finalize
Finalize不安全,描述了它们的一些问题,例如:


  • 他们根本不保证能跑
  • 当它们运行时,在运行之前可能会有延迟
链接总结了如下问题:

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

请注意不要将终结器看作是C++的C++析构函数的java模拟程序。在C++中,析构函数是回收与对象相关的资源的正常方式,是构造函数的必要对应项。在Java中,当对象变得不可访问时,垃圾收集器会回收与该对象关联的存储,程序员无需特别努力。C++析构函数还用于回收其他非内存资源。在Java中,try finally块通常用于此目的

如果您真的需要使用finalize
显示了如何重写finalize,但除非绝对必要,否则这是一个坏主意。

我认为Kotlin没有析构函数,因为Java没有析构函数。然而,Java有一个
finalize
方法,更多信息取决于kotlin使用的目标,对于JVM来说,没有@Naetmul所指出的析构函数。请看这个相关的问题“像任何其他编程语言一样”—实际上并不是很多语言都有析构函数,绝对没有基于跟踪垃圾收集的语言拥有它们。在您的第一个示例中,有什么东西可以防止开发人员“误用”吗?我的想法大致是
val foobar=MyResource();foobar.doThing()“它们根本不能保证运行”这只是因为程序可以退出。
Closeable
也存在同样的问题。任何操作都不会禁用操作系统的进程管理或计算机的电源按钮。