Kotlin编程语言中的析构函数

时间:2018-02-05 13:14:32

标签: kotlin destructor

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

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

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

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

1 个答案:

答案 0 :(得分:9)

处理需要在Kotlin中关闭的资源

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

val result = MyResource().use { resource ->
    resource.doThing();
}

这样在使用区块内你的资源可用,之后你会得到结果,这是doThing()返回的结果,你的资源将被关闭。由于您尚未将其存储在变量中,因此还可以避免在资源关闭后意外使用该资源。

为什么要避免finalize

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

  • 他们无法保证全部投放
  • 当它们运行时,可能会在运行之前出现延迟

链接总结了这样的问题:

  

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

     

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

如果确实需要使用finalize

This link显示了如何覆盖终结,但除非绝对必要,否则这是一个坏主意。