【问题标题】:destructor in Kotlin programming languageKotlin 编程语言中的析构函数
【发布时间】:2018-07-15 08:39:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为 Kotlin 没有析构函数,因为 Java 没有析构函数。但是,Java 有一个 finalize 方法,更多信息请参见 stackoverflow.com/questions/171952/…
  • 这取决于 kotlin 使用的目标,对于 JVM,没有 @Naetmul 指出的析构函数,请参阅此相关问题 stackoverflow.com/questions/44747862/…
  • “像任何其他编程语言一样”——实际上并没有那么多语言拥有它们,而且绝对没有种基于跟踪垃圾收集的语言拥有它们。

标签: kotlin destructor


【解决方案1】:

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

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

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

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

为什么要避免finalize

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

  • 根本不保证它们会运行
  • 当它们运行时,运行前可能会有延迟

链接总结了这样的问题:

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

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

如果你真的需要使用finalize

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

【讨论】:

  • 在您的第一个示例中,有什么可以防止开发人员“滥用”吗?我在想val foobar = MyResource(); foobar.doThing();
  • "它们根本不保证运行" 那只是因为程序可以退出。 Closeable 也存在同样的问题。没有什么会禁用操作系统的进程管理或计算机的电源按钮。
猜你喜欢
  • 1970-01-01
  • 2021-07-12
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多